armlinux中的ELF奇点与动态链接

armlinux中的ELF奇点与动态链接,linux,arm,elf,Linux,Arm,Elf,在ARM elf二进制文件中有一些东西我想更好地理解 我需要弄清楚这一点,为gp2x f200获取我的自制汇编程序输出ELF可执行文件。因此,我开始使用open2x交叉编译工具链编译此程序: #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(){ chdir("/usr/gp2x"); execl("/usr/gp2x/gp2xmenu", "/usr/gp2

在ARM elf二进制文件中有一些东西我想更好地理解

我需要弄清楚这一点,为gp2x f200获取我的自制汇编程序输出ELF可执行文件。因此,我开始使用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上的结构似乎没有太大区别。它实际上看起来非常熟悉!甚至搬迁的类型也很熟悉(R_386_JUMP_插槽与R_ARM_JUMP_插槽)。虽然这里开始有点奇怪了

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]!
程序正在加载到0x8000中,所以我有点理解这一部分。除了我不明白如果我用-fPIC-shared编译这个,它怎么会是一样的


所以。。ARM下的动态链接是如何工作的?

我今天晚上自己解决了这个问题。ARM linux上有许多可能的重新定位机制。我查看了说明书,发现了一种相对合理的搬迁方式:R_ARM_ABS32。我唯一要做的就是使用它

与X86 ELF后端相比,除了ELF头中的字节与我在gcc生成的二进制文件中找到的字节相匹配外,我不需要做任何其他更改。为了安全起见,我用二进制对齐了一些结构

为了将来,我必须提供一种将分支代码插入PLT的方法,或者采取一些其他方法,我可以生成使用共享库的更大程序。这是一个汇编程序设计问题,而不是理解ELF格式的问题

几分钟前在gp2x f200中运行了我的第一个应用程序!它使用'system'-libc函数将问候语写入文件并返回到机器的主菜单\o/

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]!
    82ec:   e28fc600    add ip, pc, #0  ; 0x0
    82f0:   e28cca08    add ip, ip, #32768  ; 0x8000
    82f4:   e5bcf350    ldr pc, [ip, #848]!