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