Support --hash-style=gnu.
This commit is contained in:
parent
94633a5094
commit
13670ee669
3 changed files with 50 additions and 16 deletions
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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"));
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue