More than 65536 sections in an ELF file
Ian Lance Taylor
iant@google.com
Sat Mar 8 00:19:00 GMT 2008
It seems to me that the support in BFD for ELF files with more than
65536 sections is at least partially wrong. This code in
assign_section_numbers
if (section_number == SHN_LORESERVE)
section_number += SHN_HIRESERVE + 1 - SHN_LORESERVE;
causes a range of section numbers to be skipped. The effect is that
any links to sections with an index larger than SHN_LORESERVE are
incremented. This is effectively undone in elf_object_p in elfcode.h,
which skips that range when building an array.
I just built an ELF object file with 70010 sections. As usual, the
section string table is near the end of the sections, which means
that its index is greater than SHN_LORESERVE == 0xff00.
The ELF standard is pretty clear about the values in the ELF header:
e_shnum
This member holds the number of entries in the section header
table. Thus the product of e_shentsize and e_shnum gives the
section header table's size in bytes. If a file has no section
header table, e_shnum holds the value zero.
If the number of sections is greater than or equal to
SHN_LORESERVE (0xff00), this member has the value zero and the
actual number of section header table entries is contained in the
sh_size field of the section header at index 0. (Otherwise, the
sh_size member of the initial entry contains 0.)
e_shstrndx
This member holds the section header table index of the entry
associated with the section name string table. If the file has no
section name string table, this member holds the value
SHN_UNDEF. See ``Sections'' and ``String Table'' below for more
information.
If the section name string table section index is greater than or
equal to SHN_LORESERVE (0xff00), this member has the value
SHN_XINDEX (0xffff) and the actual index of the section name
string table section is contained in the sh_link field of the
section header at index 0. (Otherwise, the sh_link member of the
initial entry contains 0.)
So what I expect to see is that the section header at index 0 will
have an sh_size field of 70010 and an sh_link field of 70006. What I
see in fact is an sh_size field of 70010 and an sh_link field of
70262. That is because BFD has added SHN_HIRESERVE - SHN_LORESERVE ==
256 to the section number of the section name string table. 70006 +
256 == 70262.
But this does not follow the ELF standard. And unfortunately there
are probably now a few invalid ELF files out there.
Ian
More information about the Binutils
mailing list