diff options
author | Ian Lance Taylor <ian@airs.com> | 1995-07-04 16:54:49 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 1995-07-04 16:54:49 +0000 |
commit | b176e1e92a344be1f241b74f03ee00241bd5cde3 (patch) | |
tree | 93bc1829d56a4eaef62f1e237283044803dd514d /bfd/elf.c | |
parent | 194fc93542a4d8d88ed74628d43073e6f3ad13c3 (diff) | |
download | gdb-b176e1e92a344be1f241b74f03ee00241bd5cde3.zip gdb-b176e1e92a344be1f241b74f03ee00241bd5cde3.tar.gz gdb-b176e1e92a344be1f241b74f03ee00241bd5cde3.tar.bz2 |
* libelf.h (struct elf_link_hash_table): Add needed field. Remove
saw_needed field.
* elfcode.h (elf_link_add_object_symbols): If elf_dt_needed_name
is an empty string, don't make a DT_NEEDED entry in the output
file. Record all DT_NEEDED entries found in input dynamic
objects.
(elf_link_output_extsym): Don't check saw_needed when issuing
warnings.
* elf.c (_bfd_elf_link_hash_table_init): Initialize needed, not
saw_needed.
(bfd_elf_get_needed_list): New function.
* bfd-in.h (struct bfd_elf_link_needed_list): Define.
(bfd_elf_get_needed_list): Define.
* bfd-in2.h: Rebuild.
PR 7083.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r-- | bfd/elf.c | 77 |
1 files changed, 66 insertions, 11 deletions
@@ -122,14 +122,14 @@ elf_get_str_section (abfd, shindex) if (i_shdrp == 0 || i_shdrp[shindex] == 0) return 0; - shstrtab = i_shdrp[shindex]->rawdata; + shstrtab = (char *) i_shdrp[shindex]->contents; if (shstrtab == NULL) { /* No cached one, attempt to read, and cache what we read. */ offset = i_shdrp[shindex]->sh_offset; shstrtabsize = i_shdrp[shindex]->sh_size; shstrtab = elf_read (abfd, offset, shstrtabsize); - i_shdrp[shindex]->rawdata = (void *) shstrtab; + i_shdrp[shindex]->contents = (PTR) shstrtab; } return shstrtab; } @@ -147,15 +147,15 @@ elf_string_from_elf_section (abfd, shindex, strindex) hdr = elf_elfsections (abfd)[shindex]; - if (!hdr->rawdata + if (hdr->contents == NULL && elf_get_str_section (abfd, shindex) == NULL) return NULL; - return ((char *) hdr->rawdata) + strindex; + return ((char *) hdr->contents) + strindex; } /* Make a BFD section from an ELF section. We store a pointer to the - BFD section in the rawdata field of the header. */ + BFD section in the bfd_section field of the header. */ boolean _bfd_elf_make_section_from_shdr (abfd, hdr, name) @@ -166,9 +166,10 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name) asection *newsect; flagword flags; - if (hdr->rawdata != NULL) + if (hdr->bfd_section != NULL) { - BFD_ASSERT (strcmp (name, ((asection *) hdr->rawdata)->name) == 0); + BFD_ASSERT (strcmp (name, + bfd_get_section_name (abfd, hdr->bfd_section)) == 0); return true; } @@ -210,7 +211,7 @@ _bfd_elf_make_section_from_shdr (abfd, hdr, name) if (! bfd_set_section_flags (abfd, newsect, flags)) return false; - hdr->rawdata = (PTR) newsect; + hdr->bfd_section = newsect; elf_section_data (newsect)->this_hdr = *hdr; return true; @@ -301,6 +302,45 @@ bfd_elf_generic_reloc (abfd, return bfd_reloc_continue; } +/* Display ELF-specific fields of a symbol. */ +void +bfd_elf_print_symbol (ignore_abfd, filep, symbol, how) + bfd *ignore_abfd; + PTR filep; + asymbol *symbol; + bfd_print_symbol_type how; +{ + FILE *file = (FILE *) filep; + switch (how) + { + case bfd_print_symbol_name: + fprintf (file, "%s", symbol->name); + break; + case bfd_print_symbol_more: + fprintf (file, "elf "); + fprintf_vma (file, symbol->value); + fprintf (file, " %lx", (long) symbol->flags); + break; + case bfd_print_symbol_all: + { + CONST char *section_name; + section_name = symbol->section ? symbol->section->name : "(*none*)"; + bfd_print_symbol_vandf ((PTR) file, symbol); + fprintf (file, " %s\t", section_name); + /* Print the "other" value for a symbol. For common symbols, + we've already printed the size; now print the alignment. + For other symbols, we have no specified alignment, and + we've printed the address; now print the size. */ + fprintf_vma (file, + (bfd_is_com_section (symbol->section) + ? ((elf_symbol_type *) symbol)->internal_elf_sym.st_value + : ((elf_symbol_type *) symbol)->internal_elf_sym.st_size)); + fprintf (file, " %s", symbol->name); + } + break; + } +} + /* Create an entry in an ELF linker hash table. */ struct bfd_hash_entry * @@ -334,7 +374,8 @@ _bfd_elf_link_hash_newfunc (entry, table, string) ret->dynindx = -1; ret->dynstr_index = 0; ret->weakdef = NULL; - ret->copy_offset = 0; + ret->got_offset = (bfd_vma) -1; + ret->plt_offset = (bfd_vma) -1; ret->type = STT_NOTYPE; ret->elf_link_hash_flags = 0; } @@ -352,10 +393,13 @@ _bfd_elf_link_hash_table_init (table, abfd, newfunc) struct bfd_hash_table *, const char *)); { + table->dynamic_sections_created = false; table->dynobj = NULL; - table->dynsymcount = 0; + /* The first dynamic symbol is a dummy. */ + table->dynsymcount = 1; table->dynstr = NULL; table->bucketcount = 0; + table->needed = NULL; return _bfd_link_hash_table_init (&table->root, abfd, newfunc); } @@ -386,7 +430,8 @@ _bfd_elf_link_hash_table_create (abfd) /* This is a hook for the ELF emulation code in the generic linker to tell the backend linker what file name to use for the DT_NEEDED - entry for a dynamic object. */ + entry for a dynamic object. The generic linker passes name as an + empty string to indicate that no DT_NEEDED entry should be made. */ void bfd_elf_set_dt_needed_name (abfd, name) @@ -395,3 +440,13 @@ bfd_elf_set_dt_needed_name (abfd, name) { elf_dt_needed_name (abfd) = name; } + +/* Get the list of DT_NEEDED entries for a link. */ + +struct bfd_elf_link_needed_list * +bfd_elf_get_needed_list (abfd, info) + bfd *abfd; + struct bfd_link_info *info; +{ + return elf_hash_table (info)->needed; +} |