我编译非常非常简单的组装代码Linux下NASM和ld(CentOS6 32位)。
nasm -f elf -o basic1.o basic1.asm
ld -o basic1 basic1.o
cat basic1.asm
;---------------------------------------
section .data
msg db 'hello world', 10, 00
section .bss
tests resd 100
segment .text
global _start
_start:
然后,我使用-x选项执行objdump。
basic1: file format elf32-i386
basic1
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048060
Program Header:
LOAD off 0x00000000 vaddr 0x08049000 paddr 0x08049000 align 2**12
filesz 0x00000061 memsz 0x000001f4 flags rw-
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 0000000d 08049054 08049054 00000054 2**2
CONTENTS, ALLOC, LOAD, DATA
1 .bss 00000190 08049064 08049064 00000061 2**2
ALLOC
2 .comment 0000001f 00000000 00000000 00000061 2**0
CONTENTS, READONLY
SYMBOL TABLE:
08049054 l d .data 00000000 .data
08049064 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 l df *ABS* 00000000 basic1.asm
08049054 l .data 00000000 msg
08049064 l .bss 00000000 tests
08048060 g .data 00000000 _start
08049061 g *ABS* 00000000 __bss_start
08049061 g *ABS* 00000000 _edata
080491f4 g *ABS* 00000000 _end
根据Wikipedia的描述,ELF文件结构在32位环境中的标头大小为0x34。
我编译的汇编代码的输出在位置0x54处有一个数据段。
那么0x35和0x53之间的代码是什么?
当我使用xxd命令查看内容时,得到以下结果。这个结果是什么意思?
0000000: 7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............
0000010: 0200 0300 0100 0000 6080 0408 3400 0000 ........`...4...
0000020: b000 0000 0000 0000 3400 2000 0100 2800 ........4. ...(.
0000030: 0700 0400 0100 0000 0000 0000 0090 0408 ................
0000040: 0090 0408 6100 0000 f401 0000 0600 0000 ....a...........
0000050: 0010 0000 6865 6c6c 6f20 776f 726c 640a ....hello world.
0000060: 0000 5468 6520 4e65 7477 6964 6520 4173 ..The Netwide As
0000070: 7365 6d62 6c65 7220 302e 3939 2e30 3500 sembler 0.99.05.
0000080: 002e 7379 6d74 6162 002e 7374 7274 6162 ..symtab..strtab
0000090: 002e 7368 7374 7274 6162 002e 6461 7461 ..shstrtab..data
00000a0: 002e 6273 7300 2e63 6f6d 6d65 6e74 0000 ..bss..comment..
00000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000d0: 0000 0000 0000 0000 1b00 0000 0100 0000 ................
00000e0: 0300 0000 5490 0408 5400 0000 0d00 0000 ....T...T.......
00000f0: 0000 0000 0000 0000 0400 0000 0000 0000 ................
0000100: 2100 0000 0800 0000 0300 0000 6490 0408 !...........d...
0000110: 6100 0000 9001 0000 0000 0000 0000 0000 a...............
0000120: 0400 0000 0000 0000 2600 0000 0100 0000 ........&.......
0000130: 0000 0000 0000 0000 6100 0000 1f00 0000 ........a.......
0000140: 0000 0000 0000 0000 0100 0000 0000 0000 ................
0000150: 1100 0000 0300 0000 0000 0000 0000 0000 ................
0000160: 8000 0000 2f00 0000 0000 0000 0000 0000 ..../...........
0000170: 0100 0000 0000 0000 0100 0000 0200 0000 ................
0000180: 0000 0000 0000 0000 c801 0000 b000 0000 ................
0000190: 0600 0000 0700 0000 0400 0000 1000 0000 ................
00001a0: 0900 0000 0300 0000 0000 0000 0000 0000 ................
00001b0: 7802 0000 3500 0000 0000 0000 0000 0000 x...5...........
00001c0: 0100 0000 0000 0000 0000 0000 0000 0000 ................
00001d0: 0000 0000 0000 0000 0000 0000 5490 0408 ............T...
00001e0: 0000 0000 0300 0100 0000 0000 6490 0408 ............d...
00001f0: 0000 0000 0300 0200 0000 0000 0000 0000 ................
0000200: 0000 0000 0300 0300 0100 0000 0000 0000 ................
0000210: 0000 0000 0400 f1ff 0c00 0000 5490 0408 ............T...
0000220: 0000 0000 0000 0100 1000 0000 6490 0408 ............d...
0000230: 0000 0000 0000 0200 1600 0000 6080 0408 ............`...
0000240: 0000 0000 1000 0100 1d00 0000 6190 0408 ............a...
0000250: 0000 0000 1000 f1ff 2900 0000 6190 0408 ........)...a...
0000260: 0000 0000 1000 f1ff 3000 0000 f491 0408 ........0.......
0000270: 0000 0000 1000 f1ff 0062 6173 6963 312e .........basic1.
0000280: 6173 6d00 6d73 6700 7465 7374 7300 5f73 asm.msg.tests._s
0000290: 7461 7274 005f 5f62 7373 5f73 7461 7274 tart.__bss_start
00002a0: 005f 6564 6174 6100 5f65 6e64 00 ._edata._end.
此外,注释段结束的0x80之后的代码是什么意思?
答案 0 :(得分:1)
您可以使用readelf -S <your_file>
获得有关如何在ELF中放置节的更多详细信息。然后您可能会看到.data
之前还有其他部分,例如
.text
,其中代码存储部分.data
存储数据的地方还有一些调试部分,例如:
.shstrtab
- 节头字符串表简单地其它部分的商店名称,.symtab
中的.strtab
用于存储汇编代码中的标签(字符串)各节的放置方式受ld
的链接描述文件的控制,您可以手工编写该脚本以更精确地放置各节。
您还可以使用strip -R symtab <your_file>
删除那些调试部分,但是您不能删除.shstrtable
,因为它是在链接文件后生成的。也不要忘记各部分对齐,并且它们之间可能有一些“孔”。
因此,用readelf
读取文件,然后将其与ELF规范匹配后,可以回答您的两个问题。
和下面是我的假设:
由于某处应该有一个包含其他节名称(.shstrtab
)的节,我认为这是您在0x80处看到的内容:
0000080: 002e 7379 6d74 6162 002e 7374 7274 6162 ..symtab..strtab
0000090: 002e 7368 7374 7274 6162 002e 6461 7461 ..shstrtab..data
00000a0: 002e 6273 7300 2e63 6f6d 6d65 6e74 0000 ..bss..comment..
而且有一个是前另一个节中的.data
(前0x53),该你会在后面看到
答案 1 :(得分:1)
这是Program header,也在Wikipedia中进行了解释。
ELF头文件的e_phoff
成员(文件偏移量0x1C)的值为0x34,有e_phnum
(文件偏移量0x2C)或1个条目(读取:段),因此程序头文件的结尾是偏移量0x54。
在程序和文件头旁边,还有节头,其起始于e_shoff
(文件偏移量0x20)或0xb0,包含7个条目(文件偏移量0x30),结束于偏移量0x1c8。
默认情况下,readelf
不会显示大多数部分。
您会发现索引4(偏移量0x150)的条目是 String表的条目,起始于偏移量0x80(参见值0x160),大小为0x2e(参见值0x164)。
因此,在0x80处有ELF结构本身使用的字符串。