QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4302|回复: 11

编译应用程序出错

[复制链接]
发表于 2004-7-27 19:38:36 | 显示全部楼层 |阅读模式
我安装了uClinux-dist-20030526版本,使用arm-elf-20030314能够成功编译.
并在Skyeye下面能够成功运行.
但是,当我编译/uClinux-dist/user/games/dungeon下的文件时,出现如下错误信息:
arm-elf-gcc  -o dungeon actors.o ballop.o clockr.o demons.o dgame.o dinit.o dmain.o dso1.o dso2.o dso3.o dso4.o dso5.o dso6.o dso7.o dsub.o dverb1.o dverb2.o gdt.o lightp.o local.o nobjs.o np.o np1.o np2.o np3.o nrooms.o objcts.o rooms.o sobjs.o supp.o sverbs.o verbs.o villns.o
/usr/local/lib/gcc-lib/arm-elf/2.95.3/libgcc.a(__main.o): In function `__do_global_ctors':
__main.o(.text+0xc4): undefined reference to `__CTOR_LIST__'
/usr/local/lib/gcc-lib/arm-elf/2.95.3/libgcc.a(__main.o)(.data+0x0): undefined reference to `__DTOR_LIST__'
collect2: ld returned 1 exit status
make: *** [dungeon] Error 1
并且编译任何一个应用程序都会出现这个错误!
请问我应该如何解决?
发表于 2004-7-27 23:33:02 | 显示全部楼层
那你是如何编译成功uclinux-dist-20030526的?如果你编译成功了,应该有相应的应用程序也编成功了。
建议用新的uclinux-dist-200404xx
回复

使用道具 举报

发表于 2004-8-11 11:09:25 | 显示全部楼层
加上-Wl,elf2flt
回复

使用道具 举报

发表于 2004-8-24 17:48:34 | 显示全部楼层
我也出现过这个问题,不是-Wl,elf2flt的问题,我编译时就加了的,有一次成功生成了,我想还是uClibc的核心的问题,也就是C Runtime Lib的问题
回复

使用道具 举报

发表于 2004-8-24 17:52:29 | 显示全部楼层
arm-elf-ld -L/usr/local/uClibc -elf2flt -o hello
/usr/local/uClibc/lib/crt0.o crtbegin.o hello.o crtend.o –lc –lgcc
-lc
可以完全实现,snmpd就由此完成,以前我用 -Wl,-elf2flt=-z不行的,记住加上lgcc
回复

使用道具 举报

发表于 2004-8-24 22:38:20 | 显示全部楼层
还有一种可能是系统里安装两个交叉编译的编译器如arm-elf-gcc,arm-linux-gcc之类的。两者都安装在/usr/local中,有可能其中一个在安装时覆盖了另一个编译器所需的文件,导致再编译时产生混乱。彻底删除(编译器和相应的库都删了才行)其中一个应该就OK了吧。
回复

使用道具 举报

发表于 2004-8-25 15:44:23 | 显示全部楼层
其实不然,最安全的做法是在Makefile中加入完整路径,如果你使用Redhat Linux,建议你在自己的$HOME/.bash_profile中加入路径,文件可以在任何位置,这样不会影响其它环境变量.实际上这两种编译器的路径是不同的,并不会产生冲突,真正的冲突在于系统寻找arm-elf-gcc或arm-linux-gcc的路径先后顺序.一般来说.在/bin:/sbin/usr/bin:/usr/sbin中的执行文件最快被引用./usr/local/bin:/usr/local/sbin等也可被检测,还可以用export PATH=/xxx/uuy/bi等,但编译时系统寻找的不是一定恰好是你想要的编译器.如使用2.95.3和3.0以上的是不同的.有些在低版中是通不过的,还有与你的计算机有关,如果用i386可能很好,但如果用P IV或指定Build HOST的ARCH,编译出来的结果会有差异的.甚至SIZE都不一样.有时我们发现,在新的PC中,编译过的代码在目标机上运行不起来.

以上诸点,仅供参考!
回复

使用道具 举报

发表于 2004-8-26 11:58:07 | 显示全部楼层
不是的

直接用arm-elf-ld和arm-elf-gcc当然是不同的
蓝牙楼主用arm-elf-gcc驱动ld,缺省已经做了-lc -lgcc和
crt0.o连接的工作.
所以gcc hello.c这样简单命令就能成功编译a.out
至于arm-elf-gcc的情况加上-elf2flt,ok.
(实验的结果,具体原因不知,倒是个有趣的问题,哪位可以解释一下)
当然有可能连接到不想要的库,直接用ld控制更精确.

O.Brire直接用的arm-elf-ld当然要连接libgcc.a了
回复

使用道具 举报

发表于 2004-8-30 17:14:43 | 显示全部楼层

a.out b.out

我用arm-elf-gcc -Wl,-elf2flt 编译文件,结果是放在uClinux上无法执行.出现了:
BINFMT_FLAT: bad magic/rev (0x0, need 0x4)
BINFMT_FLAT: bad magic/rev (0x0, need 0x4)
这是为什么?
uClinux使用这种格式的可执行文件格式真害人(b.out),arm-linux-gcc就可以.不是elf格式.而且没法strip, 直接用-elf2flt编译,生成的好像是strip了的.但大的系统就麻烦了.uClibc的运行库本身还是arm-elf格式的.
回复

使用道具 举报

发表于 2004-8-31 14:23:11 | 显示全部楼层
BINFMT_FLAT: reloc outside program 0x240d000c (0 - 0xfff83c94/0xc06a0), killing
snmpd!
BINFMT_FLAT: reloc outside program 0x240d000c (0 - 0xfff83c94/0xc06a0), killing
snmpd!
pid 79: failed 11

现在这种问题怎么解决,应当是由于uClinux中不带MMU管理的原因.重定位时,内存地址超界,但怎么办呢?
回复

使用道具 举报

发表于 2004-9-2 10:12:07 | 显示全部楼层
BINFMT_FLAT的问题是产生的文件不是
正确的FLAT格式.似乎没有正确调用elf2flt.
bad magic/rev没有产生出标准的magic number"bFLT 4"
reloc 的值也不对.

另外,flat格式没有symbol table,不需要strip
回复

使用道具 举报

发表于 2005-4-23 22:39:56 | 显示全部楼层
我也是这样的
我的应用程序用ftp下载到板子的
但是不能正常运行
类似错误
BINFMT_FLAT: reloc outside program 0x240d000c (0 - 0xfff83c94/0xc06a0), killing
snmpd!
BINFMT_FLAT: reloc outside program 0x240d000c (0 - 0xfff83c94/0xc06a0), killing
snmpd!
pid 79: failed 11


不知怎么解决
请大侠指教
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-12 06:23 , Processed in 0.125695 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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