如何在编译时控制.o文件的格式
一般使用cc编译源文件时均采用系统默认的elf文件格式,有没有办法控制编译后的文件格式,比如编译成elf32-big,elf32-little格式等等。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
一般使用cc编译源文件时均采用系统默认的elf文件格式,有没有办法控制编译后的文件格式,比如编译成elf32-big,elf32-little格式等等。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
我尝试用objcopy -O elf32-big filt.o filt_1.o直接转换,但是提示错误如下:
Unable to change endianness of input file(s)
用objcopy -O srec filt.o filt_1没有问题,不知道为什么?
多谢各位的答复,但是按照这个方法作了不行哦,另外-mbig-endian参数是ARM选项用的,好像不支持。
我把具体情况说一下,便于大家解答,
这里的源程序为.S的X86汇编文件,在redhat9下利用gcc 3.2.2编译该文件,命令大致如下:gcc *****(若干参数) -o filt.o filt.S,编译成功,
然后我使用objdump -f filt.o查看结果为:
filt.o: file format elf32-i386
architecture: i386等等
而我用相同的命令gcc *****(若干参数) -o filt.o filt.c编译c源代码文件成功后,
用objdump -f filt.o查看结果为:
filt.o: file format elf32-big
architecture: UNKNOWN等等
由于在宿主机上开发应用程序patch到内核上,其中有几个源文件用了x86汇编语言编写,在宿主机上完全可以应用,但是现在要移植到powerpc系列的主板上,结果就出现了在交叉编译时报:不支持elf32-little格式到elf32-powerpc格式重定位连接,因此这里
才有上面的问题问大家。
咨询了一下有关人士,已知的解决方法是重新用powerpc汇编代码重写汇编程序,这个相当麻烦,而且宿主机这边要调试又怎么办?
不知道各位知道有没有转换工具或其他方法可以解决这个问题
还要改ld script,也太麻烦了,而且不通用,还不如在编译行里面,加上相应的编译选项:
比如我们只要生成.o文件,则加上-c选项
如果我们想要大端/小端,则加上 -mlittle-endian, -mbig-endian
ld -V
查看你机器上的的ld所能generate的二进制文件格式。 下面是man ld的内容:
-memulation
Emulate the emulation linker. You can list the available emulations with the --verbose
or -V options.
If the -m option is not used, the emulation is taken from the "LDEMULATION" environment
variable, if that is defined.
Otherwise, the default emulation depends upon how the linker was configured.
如何设定?比如我需要编译为elf32-big格式,我查了帮助,没有看到相关的选项,请问哪里有比较详细的说明,谢谢。
大侠有自己写过ld script吗? 我想学学, 可只能看info手册, 好杂啊
当然可以,修改LDFLAGS