objdump在链接后显示长地址

时间:2016-03-31 21:01:30

标签: linux nasm ld elf memory-address

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

nasm program

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

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

objdump

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

enter image description here

问题:

  1. 为什么地址变得这么长,但是,可执行文件非常小(最多500个字节)。
  2. 关于地址指向的内容,我确信它没有指向内存,因为该程序尚未收费。
  3. 他们是亲戚还是绝对地址?如果相对,那么相对于什么?如果是绝对的,那么它们怎么能是绝对的,而且程序还没有在记忆中充电。
  4. 如果这个问题对你们中的某些人来说似乎很愚蠢,我真的很抱歉,但我真的需要理解这一点,这对我的项目有很大帮助。

1 个答案:

答案 0 :(得分:0)

  

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

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

  

关于地址指向的内容,我确信它没有指向内存

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

  

他们是相对的还是绝对的地址

绝对