2014-02-12 25 views
3

這是什麼意思在下面的文件? 2**22**02 ** 2和2 ** 0的「Algn」在objdump的輸出中意味着什麼?

$ objdump -h main.o 

main.o:  file format elf32-i386 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   0000000b 00000000 00000000 00000034 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000000 00000000 00000000 00000040 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000040 2**2 
        ALLOC 
    3 .note.GNU-stack 00000000 00000000 00000000 00000040 2**0 
        CONTENTS, READONLY, CODE 
+0

更通用的「解釋所有標題問題」:http://stackoverflow.com/questions/15862288/readelf-meaning-of-column-headers –

回答

7

我假設2**2裝置2 ,或4字節對齊,而2**0意味着沒有(一個字節)對準。

該值來自ELF節頭的sh_addralign字段。 ELF specification states(重點礦):

sh_addralign某些部分有地址對齊限制。例如,如果某部分保存了一個 雙字,系統必須確保整個部分的雙字對齊。 也就是說,sh_addr的值必須全等於0,模數值爲 sh_addralign。目前,只允許0和2的正整數冪。 值0和1表示該部分沒有對齊限制。

由於Ray Toal mentioned,由於取向必須是2的冪,它纔有意義,objdump將表示這個值作爲兩個與2**x符號的功率。

請注意,在某些語言中,如PythonFORTRAN**是一個冪指數運算符或指數運算符。


看着objdump.c,我們看到:

static void 
dump_section_header (bfd *abfd, asection *section, 
      void *ignored ATTRIBUTE_UNUSED) 
{ 
    // ... 
    printf (" %08lx 2**%u", (unsigned long) section->filepos, 
     bfd_get_section_alignment (abfd, section)); 

而且在objdump.h

#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0) 

其中bfdalignment_power成員是:

/* The alignment requirement of the section, as an exponent of 2 - 
    e.g., 3 aligns to 2^3 (or 8). */ 

unsigned int alignment_power; 

+3

不需要假設,[請參閱ELF格式文檔](http ://www.tortall.net/projects/yasm/manual/html/objfmt-elf-section.html)。你當然是對的。 –

+0

@RayToal該鏈接中沒有任何內容表明「2 ** 2」的含義是4. –

+1

好的,對於該鏈接是正確的,但嚴重的是很難閱讀「一定是兩個冪」,除了「 objdump'作者編寫'2 **'n形式的對齊。 –

相關問題