微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – __libc_start_main @ plt如何工作?

为了研究如何在 linux中加载和运行目标文件,我制作了最简单的c代码,文件名simple.c.

int main(){}

接下来,我制作目标文件并将目标文件保存为文本文件.

$gcc ./simple.c 
$objdump -xD ./a.out > simple.text

从许多互联网文章中,我可以发现gcc动态加载启动函数,如_start,_init,__ libc_start_main @ plt等.所以我开始阅读我的汇编代码,在http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html的帮助下.

这是汇编代码的一部分.

080482e0 <__libc_start_main@plt>:
 80482e0:       ff 25 10 a0 04 08       jmp    *0x804a010
 80482e6:       68 08 00 00 00          push   $0x8
 80482eb:       e9 d0 ff ff ff          jmp    80482c0 <_init+0x2c>

disassembly of section .text:

080482f0 <_start>:
 80482f0:       31 ed                   xor    %ebp,%ebp
 80482f2:       5e                      pop    %esi
 80482f3:       89 e1                   mov    %esp,%ecx
 80482f5:       83 e4 f0                and    $0xfffffff0,%esp
 80482f8:       50                      push   %eax
 80482f9:       54                      push   %esp
 80482fa:       52                      push   %edx
 80482fb:       68 70 84 04 08          push   $0x8048470
 8048300:       68 00 84 04 08          push   $0x8048400
 8048305:       51                      push   %ecx
 8048306:       56                      push   %esi
 8048307:       68 ed 83 04 08          push   $0x80483ed
 804830c:       e8 cf ff ff ff          call   80482e0 <__libc_start_main@plt>
 8048311:       f4                      hlt
 8048312:       66 90                   xchg   %ax,%ax
 8048314:       66 90                   xchg   %ax,%ax
 8048316:       66 90                   xchg   %ax,%ax
 8048318:       66 90                   xchg   %ax,%ax
 804831a:       66 90                   xchg   %ax,%ax
 804831c:       66 90                   xchg   %ax,%ax
 804831e:       66 90                   xchg   %ax,%ax

080483ed <main>:
 80483ed:       55                      push   %ebp
 80483ee:       89 e5                   mov    %esp,%ebp
 80483f0:       b8 00 00 00 00          mov    $0x0,%eax
 80483f5:       5d                      pop    %ebp
 80483f6:       c3                      ret
 80483f7:       66 90                   xchg   %ax,%ax
 80483f9:       66 90                   xchg   %ax,%ax
 80483fb:       66 90                   xchg   %ax,%ax
 80483fd:       66 90                   xchg   %ax,%ax
 80483ff:       90                      nop



 ...

disassembly of section .got:

08049ffc <.got>:
 8049ffc:       00 00                   add    %al,(%eax)
        ...

disassembly of section .got.plt:

0804a000 <_GLOBAL_OFFSET_TABLE_>:
 804a000:       14 9f                   adc    $0x9f,%al
 804a002:       04 08                   add    $0x8,%al
        ...
 804a00c:       d6                      (bad)
 804a00d:       82                      (bad)
 804a00e:       04 08                   add    $0x8,%al
 804a010:       e6 82                   out    %al,$0x82
 804a012:       04 08                   add    $0x8,%al

我的问题是;

在0x804830c中,调用0x80482e0(我已经理解了之前的指令.).

在0x80482e0中,进程跳转到0x804a010.

在0x804a010中,指令是< out%al,$0x82>

…等待.刚出去? %al中的内容是0x82?我陷入了困境.

请帮忙….

* P.S.我是linux和操作系统的初学者.我正在通过学​​校课程学习操作系统概念,但仍然找不到如何学习正确的linux汇编语言.我已经下载了英特尔处理器手册,但它太大了,无法阅读.谁能告诉我好材料给我?谢谢.

解决方法

80482e0:       ff 25 10 a0 04 08       jmp    *0x804a010

这意味着“检索存储在0x804a010的4字节地址并跳转到它.”

804a010:       e6 82                   out    %al,$0x82
804a012:       04 08                   add    $0x8,%al

这4个字节将被视为地址0x80482e6,而不是指令.

80482e0:       ff 25 10 a0 04 08       jmp    *0x804a010
80482e6:       68 08 00 00 00          push   $0x8
80482eb:       e9 d0 ff ff ff          jmp    80482c0 <_init+0x2c>

所以我们刚刚执行了一条指令,它向前推送了一条指令.在这一点上,你可能想知道这是否有充分的理由.

有.这是典型的plt / GOT实现.包括图表在内的更多细节是在Position Independent Code in shared libraries: The Procedure Linkage Table.

__libc_start_main的真实代码位于共享库glibc中.编译器和编译时链接器不知道代码在运行时的位置,因此它们在编译的程序中放置一个简短的__libc_start_main函数,该函数只包含三条指令:

>跳转到GOT指定的位置(或5,取决于您是否愿意从0或1开始计数)
>将$8推入筹码
>跳到解析程序

第一次调用__libc_start_main时,解析器代码将运行.它将在共享库中找到__libc_start_main的实际位置,并将GOT的第4个条目修补为该地址.如果程序再次调用__libc_start_main,则jmp * 0x804a010指令将直接将程序带到共享库中的代码.

Can anyone inform me good material for me?

Wikibooks上的x86 Assembly书可能是一个开始的地方.

原文地址:https://www.jb51.cc/linux/694334.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐