ARM elf二进制文件中有些内容我想更好地理解。
我需要弄明白这一点得到我的自制汇编程序输出ELF可执行文件gp2x f200。所以我开始用open2x交叉编译工具链编译这个程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
chdir("/usr/gp2x");
execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
return 0;
}
看起来好像没问题,与x86相比没什么特别之处。在ELF标题中,Flags -field被使用了!我发现了一些ARM elf规范,但没有提到为什么需要这些规范。
ELF Header:
Magic: 7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: ARM
ABI Version: 0
Type: EXEC (Executable file)
Machine: ARM
Version: 0x1
Entry point address: 0x82f8
Start of program headers: 52 (bytes into file)
Start of section headers: 3032 (bytes into file)
Flags: 0x202, has entry point, GNU EABI, software FP
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 6
Size of section headers: 40 (bytes)
Number of section headers: 31
Section header string table index: 28
现在其他结构与x86上的结构没有什么不同。它实际上看起来非常熟悉!甚至熟悉的重定位类型(R_386_JUMP_SLOT vs. R_ARM_JUMP_SLOT)。虽然在这里它开始变得奇怪。
Relocation section '.rel.plt' at offset 0x280 contains 4 entries:
Offset Info Type Sym.Value Sym. Name
00010638 00000116 R_ARM_JUMP_SLOT 000082c8 abort
0001063c 00000416 R_ARM_JUMP_SLOT 000082d4 __libc_start_main
00010640 00000516 R_ARM_JUMP_SLOT 000082e0 execl
00010644 00000716 R_ARM_JUMP_SLOT 000082ec chdir
Disassembly of section .plt:
000082b4 <.plt>:
82b4: e52de004 str lr, [sp, #-4]!
82b8: e59fe004 ldr lr, [pc, #4] ; 82c4 <.plt+0x10>
82bc: e08fe00e add lr, pc, lr
82c0: e5bef008 ldr pc, [lr, #8]!
82c4: 00008368 andeq r8, r0, r8, ror #6
82c8: e28fc600 add ip, pc, #0 ; 0x0
82cc: e28cca08 add ip, ip, #32768 ; 0x8000
82d0: e5bcf368 ldr pc, [ip, #872]!
82d4: e28fc600 add ip, pc, #0 ; 0x0
82d8: e28cca08 add ip, ip, #32768 ; 0x8000
82dc: e5bcf360 ldr pc, [ip, #864]!
82e0: e28fc600 add ip, pc, #0 ; 0x0
82e4: e28cca08 add ip, ip, #32768 ; 0x8000
82e8: e5bcf358 ldr pc, [ip, #856]!
82ec: e28fc600 add ip, pc, #0 ; 0x0
82f0: e28cca08 add ip, ip, #32768 ; 0x8000
82f4: e5bcf350 ldr pc, [ip, #848]!
如果你看一下Sym.Value,就指向这个PLT。问题是我不明白这是如何工作的。什么是R_ARM_JUMP_SLOT造成的?为什么我的PLT包含这些奇怪的指令以及我的动态链接器如何处理它们?
82ec: e28fc600 add ip, pc, #0 ; 0x0
82f0: e28cca08 add ip, ip, #32768 ; 0x8000
82f4: e5bcf350 ldr pc, [ip, #848]!
程序被加载到0x8000所以我有点理解那部分。如果我用-fPIC -shared编译它,我无法理解这是怎么回事。
那么..动态链接如何在ARM下工作?
答案 0 :(得分:1)
我今天晚上自己解决了。 ARM linux上有很多可能的重定位机制。我查看了规格,发现了一种相对理智的重定位:R_ARM_ABS32。我唯一要做的就是使用它。
与X86 ELF后端相比,我不需要更改除elf头中的字节之外的任何其他内容,以匹配我在gcc生成的二进制文件中找到的字节。为了安全起见,我将一些结构用二进制对齐。
为了将来,我必须提供一种方法,将分支代码插入我的PLT或采取其他方法,我可以生成使用共享库的更大程序。这是一个汇编程序设计问题,而不是理解ELF格式的麻烦。
几分钟前我在gp2x f200中的第一个应用程序!它使用'system'-libc函数将问候语写入文件并返回到机器的主菜单。 \ O /