如何解决为什么入口点地址不是从 0x400000 开始
在 Ubuntu 20.10 x86_64 上
我的示例代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("helloworld\n");
return 0;
}
构建:
gcc -o test test.c
显示入口点地址:
readelf -h ./test
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement,little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x1060
Start of program headers: 64 (bytes into file)
Start of section headers: 14824 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 13
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30
为什么入口点地址从 0x1060 开始?不是 0x40000 吗?
解决方法
二进制文件是可重定位的,并且段已相互打包。 .text
段在文件中从 0x1050 开始,入口点是相对于它在文件中的位置,而不是它最终将被加载的位置。
对于不可重定位的文件,请尝试 readelf -h /usr/lib/klibc/bin/sh
。这个文件在很多方面都更简单,包括不使用解释器,而是由内核按原样加载。
我们不再在x86
。可重定位二进制文件现在是所有内容的默认设置,而不仅仅是共享库。做可重定位的东西不再是一件很痛苦的事情,而且在某种程度上它现在比不可重定位更便宜,因为无论如何我们必须发出向量表,因为处理器没有 64 位位移。
正如 Nate Eldredge 指出的那样,使用 -no-pie
进行编译会产生一个不可重定位的二进制文件,并且我已经验证了预期的起始地址出现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。