无忧启动论坛

标题: linux编译fbinst后运行出错,2011yaya2007777请进 [打印本页]

作者: jianliulin    时间: 2017-3-11 21:24
标题: linux编译fbinst后运行出错,2011yaya2007777请进

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

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


请帮忙看看我那里搞错了。

作者: 2011yaya2007777    时间: 2017-3-12 07:45
本帖最后由 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


作者: 不点    时间: 2017-3-12 09:22
jianliulin 编译成功了,只是运行出错了。

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

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

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


作者: jianliulin    时间: 2017-3-12 11:08
本帖最后由 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, 下载次数: 68)




作者: jianliulin    时间: 2017-3-12 11:09
不点 发表于 2017-3-12 09:22
jianliulin 编译成功了,只是运行出错了。

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

目前我还不会弄makefile,
作者: 不点    时间: 2017-3-12 15:42
你得告诉 yaya,你的 Linux 是不是 64 位的。我猜应该是的吧?如果 gcc 也是 64 位的,那就应该修改 makefile 里面的 gcc 的命令行参数了。印象中,好像是加个 -m32 就行了。
作者: jianliulin    时间: 2017-3-12 16:02
是64位的,centos 7.3
作者: 不点    时间: 2017-3-12 17:17
本帖最后由 不点 于 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 亲自看看。


作者: 2011yaya2007777    时间: 2017-3-12 17:21
makefile我也不懂。我没有64位环境。
作者: jianliulin    时间: 2017-3-12 17:27
不点 发表于 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
本帖最后由 不点 于 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
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。

试试看成不成?


作者: jianliulin    时间: 2017-3-12 19:03
还是不可以,如下:


[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
本帖最后由 不点 于 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 如果觉得可行的话,那就不妨试试这个方案。


作者: 2011yaya2007777    时间: 2017-3-20 19:36
本帖最后由 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 看看,这样是否可以了。

作者: jianliulin    时间: 2017-3-21 17:38
2011yaya2007777 发表于 2017-3-20 19:36
uuid --write (hdn,y) UUID

vol

uuid 命令没有任何显示,似乎命令没有执行
作者: 2011yaya2007777    时间: 2017-3-21 20:42
写命令完毕,再执行读命令,没有变化?
作者: jianliulin    时间: 2017-3-21 21:08
什么都没有读到
作者: 2011yaya2007777    时间: 2017-3-21 21:20
读什么文件系统?tat?ntfs?等等。
作者: jianliulin    时间: 2017-3-21 22:58
fat16
作者: jianliulin    时间: 2017-3-21 23:00
读同一个u盘,0306版是正常的
作者: 2011yaya2007777    时间: 2017-3-22 08:42
本帖最后由 2011yaya2007777 于 2017-3-23 15:30 编辑

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

另外问一下,fbinstTool 是否有可能对 img 映像文件进行操作?就像对真实 U 盘一样。复杂吗?
有时对 UD 进行测试,就得格式化一次 U 盘,还得再把 U 盘复制为 img 映像,挺麻烦。如果 fbinstTool 能像 BOOTICE 一样就好了。
作者: jianliulin    时间: 2017-3-22 08:50
本帖最后由 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。



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



作者: 2011yaya2007777    时间: 2017-3-23 15:45
网友求道者上传了一个 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 16:01
2011yaya2007777 发表于 2017-3-23 15:45
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 e ...

现版本FbinstTool 完全用qemu虚拟机调试grub4dos还是不行
jianliulin说fba没有分区表
只能格式化u盘
然后好想要4k对齐
作者: jianliulin    时间: 2017-3-23 17:02
2011yaya2007777 发表于 2017-3-23 15:45
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 e ...

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

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

格式化新版是有改善需求,目前没想出比较好的方案,如果谁有希望能提出来
作者: jianliulin    时间: 2017-3-23 17:14
本帖最后由 jianliulin 于 2017-3-23 17:32 编辑
求道者 发表于 2017-3-23 16:01
现版本FbinstTool 完全用qemu虚拟机调试grub4dos还是不行
jianliulin说fba没有分区表
只能格式化u盘


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

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




我的U盘全盘UD,是可以做到对齐的,或者这样还不算你要求的对齐...
作者: jianliulin    时间: 2017-3-23 17:18
2011yaya2007777 发表于 2017-3-23 15:45
网友求道者上传了一个 fba,希望重现 bug。但是打开后没有加入分区表的 efi1.img。在 FbinstTool1.7 创建 e ...

测试正常了。
作者: 2011yaya2007777    时间: 2017-3-23 18:17
我觉得导出文件为 fba 时,能带上可见分区,就可以使用qemu虚拟机调试。或者提供另存为 img 文件。
我通常是把 UD 盘使用 WinHex 复制为 img 文件,便于以后测试。因为有可能 U 盘又被格式化为其他格式了。
作者: 求道者    时间: 2017-3-23 21:37
本帖最后由 求道者 于 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大改 就彻底改了吧

作者: 求道者    时间: 2017-3-23 21:38
2011yaya2007777 发表于 2017-3-23 18:17
我觉得导出文件为 fba 时,能带上可见分区,就可以使用qemu虚拟机调试。或者提供另存为 img 文件。
我通常 ...

UUID你给我那个版本 可以用了
作者: mdyblog    时间: 2017-7-11 10:11
2011yaya2007777 发表于 2017-3-12 07:45
是否缺少 assert.h ?

关于卷标的获取:


看了下,这个是基本版,不是fbinstplus. 大家常用的fbinst1.6的有些命令,不支持。
比如 fbinst --hdlist 不支持。
也不知道格式化出来的盘和最新fbt1.7是否一致。

作者: baikunlun    时间: 2019-7-18 12:00
本帖最后由 baikunlun 于 2019-7-18 13:45 编辑

这是个老贴了,我搜fbinst源码找到这里的,拿到源码就放Linux里面试了试,确实是因为64位GCC问题,强制m32编译是可以运行的,可以列出所有磁盘,但是无法进行其它操作了,貌似不能使用括号当做参数。看来移植还有很多工作要做。
  1. [user@bogon fbinst]$ sudo ./fbinst -l
  2. [sudo] password for atmuser:
  3. (hd0): 37748736 (18g)
  4. (hd1): 1048576 (512m) *
  5. (hd2): 14770176 (7g) *
  6. [user@bogon fbinst]$ sudo ./fbinst (hd2) info
  7. bash: 未预期的符号 `(' 附近有语法错误
  8. [user@bogon fbinst]$
复制代码


在参数处理中做了下兼容,哈,可以了,更多idea等待开启
  1.   xd = xd_open (argv[i], 1);

  2. #if defined(LINUX)
  3.         char str_hd[24];
  4.         sprintf(str_hd,"%s%s%s","(",argv[i],")");
  5.         xd = xd_open (str_hd, 1);
  6. #endif

  7.   if (! xd)
  8.     quit ("open %s fails", argv[i]);

  9. [user@bogon fbinst]$ sudo ./fbinst hd2 info
  10. version: 1.7
  11. base boot sector: 63
  12. boot code size: 4
  13. primary data size: 16128
  14. extended data size: 0
  15. debug version: no
  16. bpb status: init
  17. format options:
  18. file list size: 896
  19. file list used: 1
  20. files:
  21.   1*   0x3c4 0x3b3c
  22. primary area free space: 7733640
  23. extended area free space: 0
复制代码

拿到windows后,使用mingw32 + gcc-4.8.1 编译, 一堆的错误,怎么办,大神给个提醒啊
作者: 2011yaya2007777    时间: 2019-7-18 15:29
使用mingw32 + gcc-4.8.1 编译

使用 gcc 4.6 编译




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3