objdump won't show my ELF sections

0

I have a tool emitting an ELF, which as far as I can tell is compliant to the spec. Readelf output looks fine, but objdump refuses to disassemble anything.

I have simplified the input to a single global var, and "int main(void) { return 0;}" to aid debugging - the tiny section sizes are correct.

In particular, objdump seems unable to find the sections table:

$ arm-none-linux-gnueabi-readelf -S davidm.elf 
There are 4 section headers, starting at offset 0x74:
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             NULL            ff000000 000034 00001c 00  AX  0   0  4
  [ 2] .data             NULL            ff00001c 000050 000004 00  WA  0   0  4
  [ 3] .shstrtab         NULL            00000000 000114 000017 00      0   0  0

$ arm-none-linux-gnueabi-objdump -h davidm.elf 
davidm.elf:     file format elf32-littlearm
Sections:
Idx Name          Size      VMA       LMA       File off  Algn

I also have another ELF, built from the exact same objects, only produced with regular toolchain use:

$ objdump -h kernel.elf 

kernel.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000001c  ff000000  ff000000  00008000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000004  ff00001c  ff00001c  0000801c  2**2
                  CONTENTS, ALLOC, LOAD, DATA

Even after I stripped .comment and .ARM.attributes sections (incase objdump requires them) from the 'known good' kernel.elf, it still happily lists the sections there, but not in my tool's davidm.elf.

I have confirmed the contents of the sections are identical between the two with readelf -x.

The only thing I can image is that the ELF file layout is different and breaks some expectations of BFD, which could explain why readelf (and my tool) processes it just fine but objdump has troubles.

Full readelf:

ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0xff000000
  Start of program headers:          84 (bytes into file)
  Start of section headers:          116 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         4
  Section header string table index: 3

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             NULL            ff000000 000034 00001c 00  AX  0   0  4
  [ 2] .data             NULL            ff00001c 000050 000004 00  WA  0   0  4
  [ 3] .shstrtab         NULL            00000000 000114 000017 00      0   0  0
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000034 0xff000000 0xff000000 0x00020 0x00020 RWE 0x8000

 Section to Segment mapping:
  Segment Sections...
   00     .text .data 

There is no dynamic section in this file.

There are no relocations in this file.

There are no unwind sections in this file.

No version information found in this file.

Could the aggressive packing of the on-disk layout be causing troubles? Am I in violation of some bytestream alignment restrictions BFD expects, documented or otherwise?

Lastly - this file is not intended to be mmap'd into an address space, a loader will memcpy segment data into the desired location, so there is no requirement to play mmap-friendly file-alignment tricks. Keeping the ELF small is more important.

Cheers, DavidM

EDIT: I was asked to upload the file, and/or provide 'objdump -x'. So I've done both: davidm.elf

$ objdump -x davidm.elf 

davidm.elf:     file format elf32-littlearm
davidm.elf
architecture: arm, flags 0x00000002:
EXEC_P
start address 0xff000000

Program Header:
    LOAD off    0x00000034 vaddr 0xff000000 paddr 0xff000000 align 2**15
         filesz 0x00000020 memsz 0x00000020 flags rwx
private flags = 5000002: [Version5 EABI] [has entry point]

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
SYMBOL TABLE:
no symbols
arm
objdump
readelf
asked on Stack Overflow Nov 21, 2012 by David Mirabito • edited Nov 21, 2012 by David Mirabito

1 Answer

1

OK - finally figured it out.

After building and annotating/debugging libbfd (function elf_object_p()) in the context of a little test app, I found why it was not matching on any of BFD supported targets.

I had bad sh_type flags for the section headers: NULL. Emitting STRTAB or PROGBITS (and eventually NOBITS when I get that far) as appropriate and objdump happily walks my image.

Not really surprising, in retrospect - I'm more annoyed I didn't catch this in comparing readelf outputs than anything else :(

Thanks for the help all :)

answered on Stack Overflow Nov 22, 2012 by David Mirabito

User contributions licensed under CC BY-SA 3.0