我有许多ELF格式的目标文件,带有通常的.text
和其他常见部分,我想知道是否可以使用gnu ld
或gold
进行链接即使链接器事先不知道该体系结构(带有专有工具链的8位微程序),也会将许多ELF对象文件转换为ELF可执行文件。本质上,我问的是一旦您拥有所有必需的过时文件,链接过程在某种程度上是否与平台无关,或者相反,我是否需要在某个时候滚动自己的链接器。
答案 0 :(得分:0)
不,它不起作用。
链接器必须做的主要事情是处理重定位。重定位是特定于拱的:
int f(){return 42;}
$ gcc -c foo.c -o foo && readelf -r foo Relocation section '.rela.eh_frame' at offset 0x198 contains 1 entry: Offset Info Type Sym. Value Sym. Name + Addend 000000000020 000200000002 R_X86_64_PC32 0000000000000000 .text + 0 $ gcc -m32 -c foo.c -o foo && readelf -r foo Relocation section '.rel.text' at offset 0x1d0 contains 2 entries: Offset Info Type Sym.Value Sym. Name 00000004 00000b02 R_386_PC32 00000000 __x86.get_pc_thunk.ax 00000009 00000c0a R_386_GOTPC 00000000 _GLOBAL_OFFSET_TABLE_ Relocation section '.rel.eh_frame' at offset 0x1e0 contains 2 entries: Offset Info Type Sym.Value Sym. Name 00000020 00000202 R_386_PC32 00000000 .text 00000040 00000502 R_386_PC32 00000000 .text.__x86.get_pc_thu $ clang -target arm-linux-gnueabi -c foo.c -o foo && readelf -r foo Relocation section '.rel.ARM.exidx' at offset 0x104 contains 1 entry: Offset Info Type Sym.Value Sym. Name 00000000 0000032a R_ARM_PREL31 00000000 .text
此外,链接脚本指出了应如何生成ELF文件(页面大小,起始地址等),这是特定于弓的:
ld -m elf_x86_64 --verbose ld -m elf_i386 --verbose arm-linux-gnueabi-ld --verbose
如果您不编译为静态可执行文件,则链接器还必须生成PLT条目,这些条目是本机代码(因此是特定于Arch的)。
某些架构也具有特定于拱的段(例如.ARM.extab
,.ARM.exidx
)。