What is the purpose of 00 segment?

Fangrui Song i@maskray.me
Sat Apr 24 05:21:57 GMT 2021


On 2021-04-23, Peng Yu wrote:
>On Fri, Apr 23, 2021 at 5:57 PM Fangrui Song <i@maskray.me> wrote:
>>
>> 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.
>
>If the first segment is used by the loader, why when I change the
>first segment type from LOAD to NULL, the prog still runs? Is that
>NULL means that it is ignored by loader? If it can run with NULL, then
>at least it is not essential. Why keeping a nonessential segment in
>the ELF file?

How do you make it PT_NULL?

For edge cases, an implementation does not necessarily make a program
header minimal, if doing so will add more code complexity not worth it.

>> 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
>
>
>
>-- 
>Regards,
>Peng


More information about the Binutils mailing list