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

Can I use a generic ELF linker for an unknown (proprieatary) architecture ELF objects?

我有一些ELF格式的目标文件,有通常的.text和其他公共部分,我想知道是否可以使用gnu ldgold将 link 一些 ELF 对象文件转换为 ELF 可执行文件,即使linker 事先不知道架构(带有专有工具链的 8 位微处理器)。本质上,我是在问 linking 过程是否在某种程度上独立于平台,一旦您拥有所有必需的对象文件,或者相反,我将需要推出自己的 linker在某个时候。

不行,不行。

链接器必须做的一件主要事情是处理重定位。重定位是特定于架构的:

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 条目,这些条目是本机代码(因此是特定于架构的)。

一些架构也有特定于架构的部分(例如 .ARM.extab.ARM.exidx)。