是否可以将通用ELF链接器用于未知(专有)体系结构ELF对象?

时间:2019-12-03 08:58:42

标签: linker ld elf

我有许多ELF格式的目标文件,带有通常的.text和其他常见部分,我想知道是否可以使用gnu ldgold进行链接即使链接器事先不知道该体系结构(带有专有工具链的8位微程序),也会将许多ELF对象文件转换为ELF可执行文件。本质上,我问的是一旦您拥有所有必需的过时文件,链接过程在某种程度上是否与平台无关,或者相反,我是否需要在某个时候滚动自己的链接器。

1 个答案:

答案 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)。