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



我有许多ELF格式的目标文件,具有通常的.text和其他常见部分,我想知道GNUldgold是否可以用于将许多ELF对象文件链接到ELF可执行文件中,即使链接器事先不知道该架构(具有专有工具链的8位微(。从本质上讲,我是在问,一旦您拥有所有必需的 obect 文件,链接过程是否在某种程度上独立于平台,或者相反,我是否需要在某个时候滚动自己的链接器。

不,它不起作用。

链接器必须做的一件主要事情是处理重定位。搬迁是特定于建筑的:

int f(){return 42;}
$ gcc -c foo.c -o foo && readelf -r foo 偏移0x198的".rela.eh_frame"部分包含 1 个条目: 偏移信息 类型 符号 值 符号 名称 + 添加 000000000020 000200000002 R_X86_64_PC32 00000000000000000 .text + 0 $ gcc -m32 -c foo.c -o foo && readelf -r foo 偏移量0x1d0处的".rel.text"重新定位部分包含 2 个条目:  偏移量信息类型 符号.值符号名称 00000004 00000b02 R_386_PC32 00000000 __x86.get_pc_thunk.ax 00000009 00000c0a R_386_GOTPC 00000000 _GLOBAL_OFFSET_TABLE_ 偏移0x1e0处的".rel.eh_frame"部分包含 2 个条目:  偏移量信息类型 符号.值符号名称 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 搬迁部分 '.rel.偏移量 0x104 处的 ARM.exidx' 包含 1 个条目:  偏移量信息类型 符号.值符号名称 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(。