[ELF标头]和[数据段]之间的空间是多少?

时间:2019-02-02 07:29:27

标签: assembly nasm elf

我编译非常非常简单的组装代码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之后的代码是什么意思?

2 个答案:

答案 0 :(得分:1)

您可以使用readelf -S <your_file>获得有关如何在ELF中放置节的更多详细信息。然后您可能会看到.data之前还有其他部分,例如

    在0对准
  • 空部与0大小
  • .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结构本身使用的字符串。