无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 19051|回复: 33
打印 上一主题 下一主题

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

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

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

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

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

点评

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

使用道具 举报

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

使用道具 举报

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
回复

使用道具 举报

4#
发表于 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 字节,才能继续运行,否则,不运行。

大家考虑一下该怎么办。

回复

使用道具 举报

5#
发表于 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。

试试看成不成?

回复

使用道具 举报

6#
发表于 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 如果觉得可行的话,那就不妨试试这个方案。

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-11-22 15:13

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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