我可以将通用 ELF 链接器用于未知(专有)体系结构 ELF 对象吗?
Can I use a generic ELF linker for an unknown (proprieatary) architecture ELF objects?
我有一些ELF格式的目标文件,有通常的.text
和其他公共部分,我想知道是否可以使用gnu ld
或gold
将 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
)。
我有一些ELF格式的目标文件,有通常的.text
和其他公共部分,我想知道是否可以使用gnu ld
或gold
将 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
)。