What is the purpose of 00 segment?

Fangrui Song i@maskray.me
Fri Apr 23 22:51:31 GMT 2021


On Fri, Apr 23, 2021 at 12:13 PM Peng Yu via Binutils
<binutils@sourceware.org> wrote:
>
> On Fri, Apr 23, 2021 at 12:19 PM Peng Yu <pengyu.ut@gmail.com> wrote:
> >
> > Hi,
> >
> > The following example shows there are two segments. But only the 2nd
> > segment is relevant to .text. The 1st segment just contains the ELF
> > header and something (is the "something" relevant to running the
> > program?). If the first segment is removed, the program still runs?
> >
> > I don't get why the first segment is there. Can anybody explain? Thanks.
> >
> > $ cat main.asm
> > global  _start
> > _start:
> > SYS_EXIT equ 60
> > mov     rax, SYS_EXIT
> > mov     rdi, 42
> > syscall
> > $ nasm -felf64 main.asm
> > $ ld -o main.exe main.o
> > $ readelf -lW main.exe
> >
> > Elf file type is EXEC (Executable file)
> > Entry point 0x401000
> > There are 2 program headers, starting at offset 64
> >
> > Program Headers:
> >   Type           Offset   VirtAddr           PhysAddr
> > FileSiz  MemSiz   Flg Align
> >   LOAD           0x000000 0x0000000000400000 0x0000000000400000
> > 0x0000b0 0x0000b0 R   0x1000
>
> I edited the binary of the file to change LOAD to NULL for the above
> segment. The binary still runs. So this segment is not necessarily.
>
> The question is still why this useless segment is in the generated
> file. It seems to be entirely unnecessary.

It's not useless. There is a convention that the ELF header and
program headers need to be loaded.
The information is at least used by loaders.
The first PT_LOAD serves this purpose.

> >   LOAD           0x001000 0x0000000000401000 0x0000000000401000
> > 0x00000c 0x00000c R E 0x1000
> >
> >  Section to Segment mapping:
> >   Segment Sections...
> >    00
> >    01     .text
> > $ readelf -SW main.exe
> > There are 5 section headers, starting at offset 0x1120:
> >
> > Section Headers:
> >   [Nr] Name              Type            Address          Off    Size
> >  ES Flg Lk Inf Al
> >   [ 0]                   NULL            0000000000000000 000000
> > 000000 00      0   0  0
> >   [ 1] .text             PROGBITS        0000000000401000 001000
> > 00000c 00  AX  0   0 16
> >   [ 2] .symtab           SYMTAB          0000000000000000 001010
> > 0000c0 18      3   4  8
> >   [ 3] .strtab           STRTAB          0000000000000000 0010d0
> > 00002b 00      0   0  1
> >   [ 4] .shstrtab         STRTAB          0000000000000000 0010fb
> > 000021 00      0   0  1
> > Key to Flags:
> >   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
> >   L (link order), O (extra OS processing required), G (group), T (TLS),
> >   C (compressed), x (unknown), o (OS specific), E (exclude),
> >   l (large), p (processor specific)
> >
> > --
> > Regards,
> > Peng
>
>
>
> --
> Regards,
> Peng


More information about the Binutils mailing list