【问题标题】:objdump showing long addresses after the linkingobjdump 在链接后显示长地址
【发布时间】:2016-03-31 21:01:29
【问题描述】:

我在 nasm (linux) 中写了一个简单的小程序:

使用命令nasm -f elf32 -o file.o file.asm生成目标文件。

当使用objdump -M intel -d file.o 我得到这个结果:

我看到objdump 显示的地址是合理的,但是当我使用命令ld -m elf_i386 -o executable file.o 编译生成可执行代码时;我通过在可执行文件上使用 objdump 得到以下结果:

问题:

  1. 为什么地址会变得这么长,虽然可执行文件非常小(最多 500 字节)。
  2. 关于地址指向什么,我确定它没有指向内存,因为程序还没有收费。
  3. 它们是相对地址还是绝对地址??如果是相对的,那么相对于什么?如果是绝对的,它们怎么可能是绝对的,程序还没有在内存中充电。

如果这个问题对你们中的一些人来说似乎很愚蠢,我真的很抱歉,但我真的需要理解这一点,它会对我的项目有很大帮助。

【问题讨论】:

    标签: linux nasm ld elf memory-address


    【解决方案1】:

    为什么地址会变得这么长,虽然可执行文件非常小(最多 500 字节)。

    因为 i386 Linux 的默认加载地址是0x8048000。该地址与您的程序的大小完全无关。您可以将其更改为其他地址,例如-Ttext-segment=0x...000 链接器标志。

    关于地址指向什么,我确定它没有指向内存

    它指向内核在将控制权传递给它之前 加载可执行文件的地址。这也称为“链接地址”。您可以查看 readelf -l a.out 以了解您的二进制文件中存在哪些 PT_LOAD 段,以及它们将在内存中加载的位置。

    它们是相对地址还是绝对地址

    绝对的。

    【讨论】:

    • 我以为Linux使用的是相对地址!!如果我向两个具有这些地址的程序收费,它们会在哪里??!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多