Support --hash-style=gnu.

This commit is contained in:
Ian Lance Taylor 2008-03-06 00:15:04 +00:00
parent 94633a5094
commit 13670ee669
3 changed files with 50 additions and 16 deletions

View file

@ -346,6 +346,10 @@ enum SHT
SHT_LOUSER = 0x80000000, SHT_LOUSER = 0x80000000,
SHT_HIUSER = 0xffffffff, SHT_HIUSER = 0xffffffff,
// The remaining values are not in the standard. // The remaining values are not in the standard.
// Object attributes.
SHT_GNU_ATTRIBUTES = 0x6ffffff5,
// GNU style dynamic hash table.
SHT_GNU_HASH = 0x6ffffff6,
// List of prelink dependencies. // List of prelink dependencies.
SHT_GNU_LIBLIST = 0x6ffffff7, SHT_GNU_LIBLIST = 0x6ffffff7,
// Versions defined by file. // Versions defined by file.

View file

@ -1924,27 +1924,53 @@ Layout::create_dynamic_symtab(const Input_objects* input_objects,
// Create the hash tables. // Create the hash tables.
// FIXME: We need an option to create a GNU hash table. if (strcmp(parameters->options().hash_style(), "sysv") == 0
|| strcmp(parameters->options().hash_style(), "both") == 0)
{
unsigned char* phash;
unsigned int hashlen;
Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount,
&phash, &hashlen);
unsigned char* phash; Output_section* hashsec = this->choose_output_section(NULL, ".hash",
unsigned int hashlen; elfcpp::SHT_HASH,
Dynobj::create_elf_hash_table(*pdynamic_symbols, local_symcount, elfcpp::SHF_ALLOC,
&phash, &hashlen); false);
Output_section* hashsec = this->choose_output_section(NULL, ".hash", Output_section_data* hashdata = new Output_data_const_buffer(phash,
elfcpp::SHT_HASH, hashlen,
elfcpp::SHF_ALLOC, align);
false); hashsec->add_output_section_data(hashdata);
Output_section_data* hashdata = new Output_data_const_buffer(phash, hashsec->set_link_section(dynsym);
hashlen, hashsec->set_entsize(4);
align);
hashsec->add_output_section_data(hashdata);
hashsec->set_link_section(dynsym); odyn->add_section_address(elfcpp::DT_HASH, hashsec);
hashsec->set_entsize(4); }
odyn->add_section_address(elfcpp::DT_HASH, hashsec); if (strcmp(parameters->options().hash_style(), "gnu") == 0
|| strcmp(parameters->options().hash_style(), "both") == 0)
{
unsigned char* phash;
unsigned int hashlen;
Dynobj::create_gnu_hash_table(*pdynamic_symbols, local_symcount,
&phash, &hashlen);
Output_section* hashsec = this->choose_output_section(NULL, ".gnu.hash",
elfcpp::SHT_GNU_HASH,
elfcpp::SHF_ALLOC,
false);
Output_section_data* hashdata = new Output_data_const_buffer(phash,
hashlen,
align);
hashsec->add_output_section_data(hashdata);
hashsec->set_link_section(dynsym);
hashsec->set_entsize(4);
odyn->add_section_address(elfcpp::DT_GNU_HASH, hashsec);
}
} }
// Assign offsets to each local portion of the dynamic symbol table. // Assign offsets to each local portion of the dynamic symbol table.

View file

@ -465,6 +465,10 @@ class General_options
DEFINE_string(soname, options::ONE_DASH, 'h', NULL, DEFINE_string(soname, options::ONE_DASH, 'h', NULL,
_("Set shared library name"), _("FILENAME")); _("Set shared library name"), _("FILENAME"));
DEFINE_enum(hash_style, options::TWO_DASHES, '\0', "sysv",
_("Dynamic hash style"), _("[sysv,gnu,both]"),
{"sysv", "gnu", "both"});
DEFINE_string(dynamic_linker, options::TWO_DASHES, 'I', NULL, DEFINE_string(dynamic_linker, options::TWO_DASHES, 'I', NULL,
_("Set dynamic linker path"), _("PROGRAM")); _("Set dynamic linker path"), _("PROGRAM"));