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

为什么入口点地址不是从 0x400000 开始

如何解决为什么入口点地址不是从 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?