无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 12183|回复: 33

linux编译fbinst后运行出错,2011yaya2007777请进

[复制链接]
发表于 2017-3-11 21:24:23 | 显示全部楼层 |阅读模式

2011yaya2007777 你好,我用centos编译你升级后的fbinst1.7 ,执行后如下:

[jianliulin@localhost fbinst]$ ./fbinst
fbinst: fbinst.c:3376: main: Assertion `sizeof (time_t) == 4' failed.
已放弃(吐核)
[jianliulin@localhost fbinst]$


请帮忙看看我那里搞错了。
发表于 2017-3-12 07:45:51 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-3-12 08:59 编辑

是否缺少 assert.h ?

关于卷标的获取:
uuid 或者 uuid (hdx,y)
同时显示uuid及vol。
卷标支持FAT12/16/32,支持ext2fs。是BPB卷标,支持英文。

关于卷标的设置:
uuid --write-vol (hdx,y) VOL

关于uuid的设置:
uuid --write-uuid (hdx,y) UUID

fbinst所需头文件.rar

22.8 KB, 下载次数: 27, 下载积分: 无忧币 -2

grldr.rar

160.5 KB, 下载次数: 20, 下载积分: 无忧币 -2

点评

看了下,这个是基本版,不是fbinstplus. 大家常用的fbinst1.6的很大命令,不支持。 比如 fbinst --hdlist 不支持。 也不知道格式化出来的盘和最新fbt1.7是否一致。  详情 回复 发表于 2017-7-11 10:11
yaya你好 1.uuid和vol能否分开两个命令,因为脚本里面需要用%?%单独获取uuid或vol来使用。 2.我添加了你给的assert.h还是出现同样的问题,应该是makefile我没有弄正确(我不懂makfile只根据里面的单词来猜的)  详情 回复 发表于 2017-3-12 11:08
回复

使用道具 举报

发表于 2017-3-12 09:22:31 | 显示全部楼层
jianliulin 编译成功了,只是运行出错了。

time_t 应该是 4 字节整数,如果用 64 位 gcc 来编译,会不会弄错,成了 8 字节呢?

你可以试试 yaya 给的头文件。

另外一个思路,也可以修改 Makefile,给 gcc 命令行添加参数,强制让 gcc 生成 32 位的编译结果。

点评

目前我还不会弄makefile,  详情 回复 发表于 2017-3-12 11:09
回复

使用道具 举报

 楼主| 发表于 2017-3-12 11:08:23 | 显示全部楼层
本帖最后由 jianliulin 于 2017-3-12 11:17 编辑
2011yaya2007777 发表于 2017-3-12 07:45
是否缺少 assert.h ?

关于卷标的获取:


yaya你好

1.uuid和vol能否分开两个命令,因为脚本里面需要用%?%单独获取uuid或vol来使用。

2.我添加了你给的assert.h还是出现同样的问题,应该是makefile我没有弄正确(我不懂makfile只根据里面的单词来猜的),麻烦你有时间的时候帮忙整理一下makefile让他只适合编译当前fbinst即可,尽量简单,谢谢

fbinst.rar (148.84 KB, 下载次数: 67)
回复

使用道具 举报

 楼主| 发表于 2017-3-12 11:09:37 | 显示全部楼层
不点 发表于 2017-3-12 09:22
jianliulin 编译成功了,只是运行出错了。

time_t 应该是 4 字节整数,如果用 64 位 gcc 来编译,会不会 ...

目前我还不会弄makefile,
回复

使用道具 举报

发表于 2017-3-12 15:42:08 | 显示全部楼层
你得告诉 yaya,你的 Linux 是不是 64 位的。我猜应该是的吧?如果 gcc 也是 64 位的,那就应该修改 makefile 里面的 gcc 的命令行参数了。印象中,好像是加个 -m32 就行了。
回复

使用道具 举报

 楼主| 发表于 2017-3-12 16:02:55 来自手机 | 显示全部楼层
是64位的,centos 7.3
回复

使用道具 举报

发表于 2017-3-12 17:17:09 | 显示全部楼层
本帖最后由 不点 于 2017-3-12 17:27 编辑

这就差不多证实了我的猜测。

你自己就可以试试修改。打开 Makefile ,在里面的 gcc 或者 $(CC) 之类的命令关键字后插入 -m32 (它可以作为第一个参数,紧接命令关键字。-m32 的两边都要有空格,-m 和 32 之间没有空格)。试试看成不成。如果不成,那还得让 yaya 给你搞定。

补充:我所说的办法,会生成 32 位的 fbinst 可执行程序。但假如你本来就是想生成 64 位 Linux 下的可执行程序,那我这个办法可能也不是你想要的。如果你的 64 位 Linux 能够支持运行 32 位的 fbinst,那就可以试试我的办法了。如果生成的 32 位 fbinst 能够运行,那就说明 OK 了。

你还可以试试注释掉 time_t == 4 那一行检查,不让它检查报错,这样,fbinst 就可以正常运行了。但运行的结果是否正确、是否有危险,那就难说了,需要 yaya 或 bean 亲自看看。

点评

加进去后编译提示: /usr/bin/ld: final link failed: 文件格式错误 collect2: 错误:ld 返回 1 make: *** [fbinst] 错误 1  详情 回复 发表于 2017-3-12 17:27
回复

使用道具 举报

发表于 2017-3-12 17:21:26 来自手机 | 显示全部楼层
makefile我也不懂。我没有64位环境。
回复

使用道具 举报

 楼主| 发表于 2017-3-12 17:27:48 | 显示全部楼层
不点 发表于 2017-3-12 17:17
这就差不多证实了我的猜测。

你自己就可以试试修改。打开 Makefile ,在里面的 gcc 或者 $(CC) 之类的命 ...

加进去后编译提示:

/usr/bin/ld: final link failed: 文件格式错误
collect2: 错误:ld 返回 1
make: *** [fbinst] 错误 1
回复

使用道具 举报

发表于 2017-3-12 17:32:18 | 显示全部楼层
本帖最后由 不点 于 2017-3-12 17:57 编辑

你试试把 time_t 的定义改成 long ,看看是不是可以通过编译?

如果 time_t 原先是 int,你就试试改成 long
如果 time_t 原先是 unsigned int,你就试试改成 unsigned long

我怀疑 int 在 64 位环境,会变成 8 字节长,因此,把它改成 long, 就有可能成为 4 字节了。瞎猜的,不一定正确。

---------------------

又看了 time.h 中的定义。嘿嘿!time_t 在 64 位 gcc 之下,被定义为 64 位;在 32 位的 gcc 下,被定义为 32 位。而 fbinst.c 的 main() 函数在一开始就限定 32 位,即,必须 time_t 的长度为 4 字节,才能继续运行,否则,不运行。

大家考虑一下该怎么办。

回复

使用道具 举报

发表于 2017-3-12 18:36:55 | 显示全部楼层
time.h 开头有如下代码,用来定义 time_t:

  1. #ifndef _TIME_T_DEFINED
  2. /* FIXME __STRICT_ANSI__ ! */
  3. #if __MSVCRT_VERSION__ >= 0x0800
  4. #ifndef _USE_32BIT_TIME_T
  5. typedef        __time64_t time_t;
  6. #else
  7. typedef        __time32_t time_t;
  8. #endif /* !_USE_32BIT_TIME_T */
  9. #else
  10. typedef        __time32_t time_t;
  11. #endif /* __MSVCRT_VERSION__ >= 0x0800 */
  12. #define _TIME_T_DEFINED
  13. #endif
复制代码


试试修改成下面这样:


  1. #ifndef _TIME_T_DEFINED
  2. /* FIXME __STRICT_ANSI__ ! */
  3. #if __MSVCRT_VERSION__ >= 0x0800
  4. #ifndef _USE_32BIT_TIME_T
  5. typedef        __time32_t time_t;
  6. #else
  7. typedef        __time32_t time_t;
  8. #endif /* !_USE_32BIT_TIME_T */
  9. #else
  10. typedef        __time32_t time_t;
  11. #endif /* __MSVCRT_VERSION__ >= 0x0800 */
  12. #define _TIME_T_DEFINED
  13. #else
  14. typedef        __time32_t time_t;
  15. #endif
复制代码


就是说,在任何情况下,都使用 32 位的 time_t。

试试看成不成?

回复

使用道具 举报

 楼主| 发表于 2017-3-12 19:03:12 | 显示全部楼层
还是不可以,如下:


[jianliulin@localhost fbinst]$ make
cc    -c -o fbinst.o fbinst.c
cc    -c -o xdio.o xdio.c
cc    -c -o keytab.o keytab.c
cc  -ofbinst fbinst.o xdio.o keytab.o
[jianliulin@localhost fbinst]$ ./fbinst
fbinst: fbinst.c:3376: main: Assertion `sizeof (time_t) == 4' failed.
已放弃(吐核)
[jianliulin@localhost fbinst]$
回复

使用道具 举报

发表于 2017-3-12 20:29:46 | 显示全部楼层
本帖最后由 不点 于 2017-3-12 21:31 编辑

那你试验一下,看看 sizeof (time_t) == ?的时候,它不再 failed,那就知道 time_t 有多长了。

可以试试 1,2,8,应该有一个是 time_t 现在的真实值。

就是说,修改一下 fbinst.c 的 main 函数里面的 sizeof (time_t) == 4,此处的 4 分别试试用 1,2,8 来代替,进行试验。

--------------------

——唉,痴呆了——

呵呵,啥也不用改,只在 main () 的 sizeof (time_t) == 4 的前面插入一行 printf 打印出 sizeof (time_t) 的值,不就知道它的长度了吗?

printf("\n sizeof(time_t) is %d \n", sizeof(time_t));


--------------------------------------------

它肯定是 8 字节嘛,不可能是单字节或双字节。

那么,我猜 time_t 是被 64 位的 Linux (或 gcc)的系统头文件定义为 8 字节了。我猜我们后续所尝试的重新定义是失效的。

所以,无论我们怎么改,time_t 的长度都保持 8 的值不变。

======================

因此,我们不能去修改 time_t 的定义了。我们只能修改 time_t 这个变量的名字,比如说,把它修改为 my_time_t,只要它不与系统变量名相同,即可。

然后,我们定义 my_time_t 为四字节,这就 OK 了。

jianliulin 如果觉得可行的话,那就不妨试试这个方案。

回复

使用道具 举报

发表于 2017-3-20 19:36:57 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-3-22 08:43 编辑
uuid和vol能否分开两个命令,因为脚本里面需要用%?%单独获取uuid或vol来使用。

uuid --write (hdn,y) UUID

vol
vol (hdn,y)
vol --write-bpb (hdn,y) VOL_bpb
请 jianliulin 看看,这样是否可以了。

点评

uuid 命令没有任何显示,似乎命令没有执行  详情 回复 发表于 2017-3-21 17:38
回复

使用道具 举报

 楼主| 发表于 2017-3-21 17:38:46 | 显示全部楼层
2011yaya2007777 发表于 2017-3-20 19:36
uuid --write (hdn,y) UUID

vol

uuid 命令没有任何显示,似乎命令没有执行
回复

使用道具 举报

发表于 2017-3-21 20:42:13 来自手机 | 显示全部楼层
写命令完毕,再执行读命令,没有变化?
回复

使用道具 举报

 楼主| 发表于 2017-3-21 21:08:17 来自手机 | 显示全部楼层
什么都没有读到
回复

使用道具 举报

发表于 2017-3-21 21:20:31 | 显示全部楼层
读什么文件系统?tat?ntfs?等等。
回复

使用道具 举报

 楼主| 发表于 2017-3-21 22:58:55 来自手机 | 显示全部楼层
fat16
回复

使用道具 举报

 楼主| 发表于 2017-3-21 23:00:17 来自手机 | 显示全部楼层
读同一个u盘,0306版是正常的
回复

使用道具 举报

发表于 2017-3-22 08:42:22 | 显示全部楼层
本帖最后由 2011yaya2007777 于 2017-3-23 15:30 编辑

是设置 debug=0 不显示信息。现在可以显示了。

另外问一下,fbinstTool 是否有可能对 img 映像文件进行操作?就像对真实 U 盘一样。复杂吗?
有时对 UD 进行测试,就得格式化一次 U 盘,还得再把 U 盘复制为 img 映像,挺麻烦。如果 fbinstTool 能像 BOOTICE 一样就好了。

点评

这个grldr还是没有获取uuid 我的测试如下: 1.把一个128M的U盘全部格式化为ud 2.在ud里面创建两个32M的img,并且把他们关联到mbr 3.把测试的grldr放到ud 4.用qemu引导U盘,进入命令行,输入uuid。 目  详情 回复 发表于 2017-3-22 08:50
回复

使用道具 举报

 楼主| 发表于 2017-3-22 08:50:39 | 显示全部楼层
本帖最后由 jianliulin 于 2017-3-22 08:56 编辑
2011yaya2007777 发表于 2017-3-22 08:42
是设置 debug=0 不显示信息。现在可以显示了。

另外问一下,fbinstTool 是否有可能对 img 映像文件进行 ...

这个grldr还是没有获取uuid
我的测试如下:

1.把一个128M的U盘全部格式化为ud
2.在ud里面创建两个32M的img,并且把他们关联到mbr
3.把测试的grldr放到ud
4.用qemu引导U盘,进入命令行,输入uuid。
微信截图_20170322085408.png


目前fbt可以用右键创建一个img,创建时候是顺便格式化的,格式化的规则和fbinst格式化U盘一样,创建完后右键可以把这个img关联到mbr,如果要img不超过32m,可以右键十六进制编辑img,但这个操作比较容易出错,若做成bootice那样的就是重复造轮子了,


回复

使用道具 举报

发表于 2017-3-23 15:45:50 | 显示全部楼层
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 efi1.img,也不能加入分区表。只好把 U 盘格式化。终于使问题定位。

希望改进 FbinstTool1.7:
在 fba 使创建的 efi1.img 可以加入分区表;
或者
将 U 盘导入 fba 时,增加一个选项,是否保存可见分区(默认不保存)。

grldr.rar

160.76 KB, 下载次数: 3, 下载积分: 无忧币 -2

点评

测试正常了。  详情 回复 发表于 2017-3-23 17:18
其实我一直想修改fba的格式,让它变成标准的img文件(含分mbr,含fbinst内核),这样就可以直接用qemu等虚拟机直接测试。但这样破坏性太大,我怕被骂 0318版本目前导出来时候会忽略ud里面的序号为0的img文件。  详情 回复 发表于 2017-3-23 17:02
现版本FbinstTool 完全用qemu虚拟机调试grub4dos还是不行 jianliulin说fba没有分区表 只能格式化u盘 然后好想要4k对齐  详情 回复 发表于 2017-3-23 16:01
回复

使用道具 举报

发表于 2017-3-23 16:01:17 来自手机 | 显示全部楼层
2011yaya2007777 发表于 2017-3-23 15:45
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 e ...

现版本FbinstTool 完全用qemu虚拟机调试grub4dos还是不行
jianliulin说fba没有分区表
只能格式化u盘
然后好想要4k对齐

点评

我都被你说糊涂了。你说的对齐是分区表对齐,还是分区数据区对齐。你得先把标准先说出来。 fbinstTool是以扩展分区是以8M开始的,我的理解这样是对齐4K了的。也就是说可见分区是对齐,如果可见分区的扇区数是4K的  详情 回复 发表于 2017-3-23 17:14
回复

使用道具 举报

 楼主| 发表于 2017-3-23 17:02:56 | 显示全部楼层
2011yaya2007777 发表于 2017-3-23 15:45
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 e ...

其实我一直想修改fba的格式,让它变成标准的img文件(含分mbr,含fbinst内核),这样就可以直接用qemu等虚拟机直接测试。但这样破坏性太大,我怕被骂

0318版本目前导出来时候会忽略ud里面的序号为0的img文件。

格式化新版是有改善需求,目前没想出比较好的方案,如果谁有希望能提出来
回复

使用道具 举报

 楼主| 发表于 2017-3-23 17:14:13 | 显示全部楼层
本帖最后由 jianliulin 于 2017-3-23 17:32 编辑
求道者 发表于 2017-3-23 16:01
现版本FbinstTool 完全用qemu虚拟机调试grub4dos还是不行
jianliulin说fba没有分区表
只能格式化u盘


我都被你说糊涂了。你说的对齐是分区表对齐,还是分区数据区对齐。你得先把标准先说出来。

fbinstTool是以扩展分区是以8M开始的,我的理解这样是对齐4K了的。也就是说可见分区是对齐,如果可见分区的扇区数是4K的倍数,第二个分区也肯定是对齐了的,依次类推第n个也是对齐的。出现没有对齐那肯定是设置分区大小不是擦当,或者创建img文文件时候开始位置被其他文件当道了造成没对齐。


QQ截图20170323173136.jpg

我的U盘全盘UD,是可以做到对齐的,或者这样还不算你要求的对齐...

点评

第一次格式化的时候不知道为什么4K就没对齐…… 刚刚格式化的时候就4K对齐了 也许是眼花或者是设置了主分区的问题? 总之4K能对齐就太好了 然后就是发现缺少批量导入文件夹到拓展分区的办法 倒入文件夹貌似不  详情 回复 发表于 2017-3-23 21:37
回复

使用道具 举报

 楼主| 发表于 2017-3-23 17:18:09 | 显示全部楼层
2011yaya2007777 发表于 2017-3-23 15:45
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 e ...

测试正常了。
回复

使用道具 举报

发表于 2017-3-23 18:17:42 | 显示全部楼层
我觉得导出文件为 fba 时,能带上可见分区,就可以使用qemu虚拟机调试。或者提供另存为 img 文件。
我通常是把 UD 盘使用 WinHex 复制为 img 文件,便于以后测试。因为有可能 U 盘又被格式化为其他格式了。

点评

UUID你给我那个版本 可以用了  详情 回复 发表于 2017-3-23 21:38
回复

使用道具 举报

发表于 2017-3-23 21:37:43 | 显示全部楼层
本帖最后由 求道者 于 2017-3-23 21:41 编辑
jianliulin 发表于 2017-3-23 17:14
我都被你说糊涂了。你说的对齐是分区表对齐,还是分区数据区对齐。你得先把标准先说出来。

fbinstTo ...


第一次格式化的时候不知道为什么4K就没对齐……
刚刚格式化的时候就4K对齐了
也许是眼花或者是设置了主分区的问题?
总之4K能对齐就太好了

然后就是发现缺少批量导入文件夹到拓展分区的办法
倒入文件夹貌似不能指定强制导入到拓展分区里
而且也没有批量转换文件到扩展分区的办法
一旦多选 特别是同时选定文件和文件夹就什么都不能做了 批量转换文件到拓展分区就更不可能了


再一个就是编辑fba不能把img加入分区表
和yaya说的一样 这时候就没法直接用QEMU调试了 很烦

把fba搞成标准img磁盘镜像我没意见 yaya也没意见吧?
这么方便的东西就搞了吧 给yaya调试也方便啊
反正fbinst也改了这么多次 趁着1.7大改 就彻底改了吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-3-29 14:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表