我在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来获得跟随结果:
问题:
如果这个问题对你们中的某些人来说似乎很愚蠢,我真的很抱歉,但我真的需要理解这一点,这对我的项目有很大帮助。
答案 0 :(得分:0)
为什么地址变得这么长,但是,可执行文件非常小(最多500个字节)。
因为i386 Linux的默认加载地址是0x8048000
。该地址与您的程序的大小无关。您可以将其更改为其他地址,例如-Ttext-segment=0x...000
链接器标志。
关于地址指向的内容,我确信它没有指向内存
它指向内核 加载可执行文件的位置,然后再将控制权传递给它。这也称为“链接地址”。您可以查看readelf -l a.out
以查看二进制文件中存在哪些PT_LOAD
段,以及它们将在内存中加载的位置。
他们是相对的还是绝对的地址
绝对