From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Clifton To: "H . J . Lu" Cc: binutils@sources.redhat.com, Ian Lance Taylor Subject: Re: elf_link_hash_entry vs generic_link_hash_entry Date: Fri, 24 Aug 2001 09:35:00 -0000 Message-id: References: <20010823092140.A15101@lucon.org> <20010823113656.A17692@lucon.org> <20010823120958.A18304@lucon.org> X-SW-Source: 2001-08/msg00563.html Hi H.J. > How about this patch? > > H.J. > ---- > 2001-08-23 H.J. Lu > > * elflink.h (elf_link_add_object_symbols): Don't merge section > nor add the file to the loaded list if the linker hash table > is not an an ELF linker hash table. This patch does not appear to be based against the current binutils sources. (I guess it was made against your own source tree ?) Instead I created a modified version of your patch. I had to make one change though - I reverted the definition of elf_hash_table() back to its original version, since it cannot be allowed to return NULL. (It is used in too many places as the first argument to elf_link_hash_lookup). Instead I created a new macro called 'is_elf_hash_table' and I added code to check it in elf_link_add_object_symbols(), like this. Cheers Nick 2001-08-24 Nick Clifton * elf-bfd.h (elf_hash_table): Revert definition. (is_elf_hash_table): New macro. * elflink.h (elf_link_add_object_symbols): Test is_elf_hash_table before accessing ELF only fields in hash structure. (elf_link_create_dynamic_sections): Fail if not using an ELF hash structure. (elf_add_dynamic_entry): Fail if not using an ELF hash structure. (elf_link_record_local_dynamic_symbol): Fail if not using an ELF hash structure. (size_dynamic_sections): Fail if not using an ELF hash structure. (elf_adjust_dynamic_symbol): Fail if not using an ELF hash structure. (elf_bfd_final_link): Fail if not using an ELF hash structure. Index: elflink.h =================================================================== RCS file: /cvs/src/src/bfd/elflink.h,v retrieving revision 1.102 diff -p -r1.102 elflink.h *** elflink.h 2001/08/24 11:17:28 1.102 --- elflink.h 2001/08/24 16:28:30 *************** elf_link_add_object_symbols (abfd, info) *** 916,922 **** --- 916,925 ---- Elf_External_Sym *esymend; struct elf_backend_data *bed; boolean dt_needed; + struct elf_link_hash_table * hash_table; + hash_table = elf_hash_table (info); + bed = get_elf_backend_data (abfd); add_symbol_hook = bed->elf_add_symbol_hook; collect = bed->collect; *************** elf_link_add_object_symbols (abfd, info) *** 970,976 **** { struct elf_link_hash_entry *h; ! h = elf_link_hash_lookup (elf_hash_table (info), name, false, false, true); /* FIXME: What about bfd_link_hash_common? */ --- 973,979 ---- { struct elf_link_hash_entry *h; ! h = elf_link_hash_lookup (hash_table, name, false, false, true); /* FIXME: What about bfd_link_hash_common? */ *************** elf_link_add_object_symbols (abfd, info) *** 1085,1097 **** format. FIXME: If there are no input BFD's of the same format as the output, we can't make a shared library. */ if (info->shared ! && ! elf_hash_table (info)->dynamic_sections_created && abfd->xvec == info->hash->creator) { if (! elf_link_create_dynamic_sections (abfd, info)) goto error_return; } } else { asection *s; --- 1088,1103 ---- format. FIXME: If there are no input BFD's of the same format as the output, we can't make a shared library. */ if (info->shared ! && is_elf_hash_table (info) ! && ! hash_table->dynamic_sections_created && abfd->xvec == info->hash->creator) { if (! elf_link_create_dynamic_sections (abfd, info)) goto error_return; } } + else if (! is_elf_hash_table (info)) + goto error_return; else { asection *s; *************** elf_link_add_object_symbols (abfd, info) *** 1194,1200 **** n->name = anm; n->by = abfd; n->next = NULL; ! for (pn = &elf_hash_table (info)->needed; *pn != NULL; pn = &(*pn)->next) ; --- 1200,1206 ---- n->name = anm; n->by = abfd; n->next = NULL; ! for (pn = & hash_table->needed; *pn != NULL; pn = &(*pn)->next) ; *************** elf_link_add_object_symbols (abfd, info) *** 1209,1216 **** to clear runpath. Do _NOT_ bfd_release, as that frees all more recently bfd_alloc'd blocks as well. */ ! if (rpath && elf_hash_table (info)->runpath) ! elf_hash_table (info)->runpath = NULL; n = ((struct bfd_link_needed_list *) bfd_alloc (abfd, sizeof (struct bfd_link_needed_list))); --- 1215,1222 ---- to clear runpath. Do _NOT_ bfd_release, as that frees all more recently bfd_alloc'd blocks as well. */ ! if (rpath && hash_table->runpath) ! hash_table->runpath = NULL; n = ((struct bfd_link_needed_list *) bfd_alloc (abfd, sizeof (struct bfd_link_needed_list))); *************** elf_link_add_object_symbols (abfd, info) *** 1225,1231 **** n->name = anm; n->by = abfd; n->next = NULL; ! for (pn = &elf_hash_table (info)->runpath; *pn != NULL; pn = &(*pn)->next) ; --- 1231,1237 ---- n->name = anm; n->by = abfd; n->next = NULL; ! for (pn = & hash_table->runpath; *pn != NULL; pn = &(*pn)->next) ; *************** elf_link_add_object_symbols (abfd, info) *** 1252,1258 **** n->name = anm; n->by = abfd; n->next = NULL; ! for (pn = &elf_hash_table (info)->runpath; *pn != NULL; pn = &(*pn)->next) ; --- 1258,1264 ---- n->name = anm; n->by = abfd; n->next = NULL; ! for (pn = & hash_table->runpath; *pn != NULL; pn = &(*pn)->next) ; *************** elf_link_add_object_symbols (abfd, info) *** 1277,1298 **** /* If this is the first dynamic object found in the link, create the special sections required for dynamic linking. */ ! if (! elf_hash_table (info)->dynamic_sections_created) ! { ! if (! elf_link_create_dynamic_sections (abfd, info)) ! goto error_return; ! } if (add_needed) { /* Add a DT_NEEDED entry for this dynamic object. */ ! oldsize = _bfd_stringtab_size (elf_hash_table (info)->dynstr); ! strindex = _bfd_stringtab_add (elf_hash_table (info)->dynstr, name, true, false); if (strindex == (bfd_size_type) -1) goto error_return; ! if (oldsize == _bfd_stringtab_size (elf_hash_table (info)->dynstr)) { asection *sdyn; Elf_External_Dyn *dyncon, *dynconend; --- 1283,1302 ---- /* If this is the first dynamic object found in the link, create the special sections required for dynamic linking. */ ! if (! hash_table->dynamic_sections_created) ! if (! elf_link_create_dynamic_sections (abfd, info)) ! goto error_return; if (add_needed) { /* Add a DT_NEEDED entry for this dynamic object. */ ! oldsize = _bfd_stringtab_size (hash_table->dynstr); ! strindex = _bfd_stringtab_add (hash_table->dynstr, name, true, false); if (strindex == (bfd_size_type) -1) goto error_return; ! if (oldsize == _bfd_stringtab_size (hash_table->dynstr)) { asection *sdyn; Elf_External_Dyn *dyncon, *dynconend; *************** elf_link_add_object_symbols (abfd, info) *** 1302,1309 **** have already included this dynamic object in the link, just ignore it. There is no reason to include a particular dynamic object more than once. */ ! sdyn = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ! ".dynamic"); BFD_ASSERT (sdyn != NULL); dyncon = (Elf_External_Dyn *) sdyn->contents; --- 1306,1312 ---- have already included this dynamic object in the link, just ignore it. There is no reason to include a particular dynamic object more than once. */ ! sdyn = bfd_get_section_by_name (hash_table->dynobj, ".dynamic"); BFD_ASSERT (sdyn != NULL); dyncon = (Elf_External_Dyn *) sdyn->contents; *************** elf_link_add_object_symbols (abfd, info) *** 1313,1320 **** { Elf_Internal_Dyn dyn; ! elf_swap_dyn_in (elf_hash_table (info)->dynobj, dyncon, ! &dyn); if (dyn.d_tag == DT_NEEDED && dyn.d_un.d_val == strindex) { --- 1316,1322 ---- { Elf_Internal_Dyn dyn; ! elf_swap_dyn_in (hash_table->dynobj, dyncon, & dyn); if (dyn.d_tag == DT_NEEDED && dyn.d_un.d_val == strindex) { *************** elf_link_add_object_symbols (abfd, info) *** 1969,1993 **** bfd_size_type oldsize; bfd_size_type strindex; /* The symbol from a DT_NEEDED object is referenced from the regular object to create a dynamic executable. We have to make sure there is a DT_NEEDED entry for it. */ dt_needed = false; ! oldsize = _bfd_stringtab_size (elf_hash_table (info)->dynstr); ! strindex = _bfd_stringtab_add (elf_hash_table (info)->dynstr, elf_dt_soname (abfd), true, false); if (strindex == (bfd_size_type) -1) goto error_return; if (oldsize ! == _bfd_stringtab_size (elf_hash_table (info)->dynstr)) { asection *sdyn; Elf_External_Dyn *dyncon, *dynconend; ! sdyn = bfd_get_section_by_name (elf_hash_table (info)->dynobj, ".dynamic"); BFD_ASSERT (sdyn != NULL); --- 1971,1998 ---- bfd_size_type oldsize; bfd_size_type strindex; + if (! is_elf_hash_table (info)) + goto error_return; + /* The symbol from a DT_NEEDED object is referenced from the regular object to create a dynamic executable. We have to make sure there is a DT_NEEDED entry for it. */ dt_needed = false; ! oldsize = _bfd_stringtab_size (hash_table->dynstr); ! strindex = _bfd_stringtab_add (hash_table->dynstr, elf_dt_soname (abfd), true, false); if (strindex == (bfd_size_type) -1) goto error_return; if (oldsize ! == _bfd_stringtab_size (hash_table->dynstr)) { asection *sdyn; Elf_External_Dyn *dyncon, *dynconend; ! sdyn = bfd_get_section_by_name (hash_table->dynobj, ".dynamic"); BFD_ASSERT (sdyn != NULL); *************** elf_link_add_object_symbols (abfd, info) *** 1998,2004 **** { Elf_Internal_Dyn dyn; ! elf_swap_dyn_in (elf_hash_table (info)->dynobj, dyncon, &dyn); BFD_ASSERT (dyn.d_tag != DT_NEEDED || dyn.d_un.d_val != strindex); --- 2003,2009 ---- { Elf_Internal_Dyn dyn; ! elf_swap_dyn_in (hash_table->dynobj, dyncon, &dyn); BFD_ASSERT (dyn.d_tag != DT_NEEDED || dyn.d_un.d_val != strindex); *************** elf_link_add_object_symbols (abfd, info) *** 2155,2160 **** --- 2160,2166 ---- && ! info->relocateable && ! info->traditional_format && info->hash->creator->flavour == bfd_target_elf_flavour + && is_elf_hash_table (info) && (info->strip != strip_all && info->strip != strip_debugger)) { asection *stab, *stabstr; *************** elf_link_add_object_symbols (abfd, info) *** 2170,2176 **** secdata = elf_section_data (stab); if (! _bfd_link_section_stabs (abfd, ! &elf_hash_table (info)->stab_info, stab, stabstr, &secdata->stab_info)) goto error_return; --- 2176,2182 ---- secdata = elf_section_data (stab); if (! _bfd_link_section_stabs (abfd, ! & hash_table->stab_info, stab, stabstr, &secdata->stab_info)) goto error_return; *************** elf_link_add_object_symbols (abfd, info) *** 2178,2192 **** } } ! if (! info->relocateable && ! dynamic) { asection *s; for (s = abfd->sections; s != NULL; s = s->next) if ((s->flags & SEC_MERGE) ! && ! _bfd_merge_section (abfd, ! &elf_hash_table (info)->merge_info, ! s, &elf_section_data (s)->merge_info)) goto error_return; } --- 2184,2198 ---- } } ! if (! info->relocateable && ! dynamic ! && is_elf_hash_table (info)) { asection *s; for (s = abfd->sections; s != NULL; s = s->next) if ((s->flags & SEC_MERGE) ! && ! _bfd_merge_section (abfd, & hash_table->merge_info, s, ! & elf_section_data (s)->merge_info)) goto error_return; } *************** elf_link_create_dynamic_sections (abfd, *** 2219,2224 **** --- 2225,2233 ---- struct elf_link_hash_entry *h; struct elf_backend_data *bed; + if (! is_elf_hash_table (info)) + return false; + if (elf_hash_table (info)->dynamic_sections_created) return true; *************** elf_add_dynamic_entry (info, tag, val) *** 2343,2348 **** --- 2352,2360 ---- size_t newsize; bfd_byte *newcontents; + if (! is_elf_hash_table (info)) + return false; + dynobj = elf_hash_table (info)->dynobj; s = bfd_get_section_by_name (dynobj, ".dynamic"); *************** elf_link_record_local_dynamic_symbol (in *** 2379,2384 **** --- 2391,2399 ---- unsigned long dynstr_index; char *name; + if (! is_elf_hash_table (info)) + return false; + /* See if the entry exists already. */ for (entry = elf_hash_table (info)->dynlocal; entry ; entry = entry->next) if (entry->input_bfd == input_bfd && entry->input_indx == input_indx) *************** NAME(bfd_elf,size_dynamic_sections) (out *** 2895,2900 **** --- 2910,2918 ---- if (info->hash->creator->flavour != bfd_target_elf_flavour) return true; + if (! is_elf_hash_table (info)) + return false; + /* The backend may have to create some sections regardless of whether we're dynamic or not. */ bed = get_elf_backend_data (output_bfd); *************** elf_fix_symbol_flags (h, eif) *** 3542,3553 **** --- 3560,3573 ---- backend specifically; we can't just clear PLT-related data here. */ if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0 && eif->info->shared + && is_elf_hash_table (eif->info) && (eif->info->symbolic || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN) && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0) { struct elf_backend_data *bed; + bed = get_elf_backend_data (elf_hash_table (eif->info)->dynobj); if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN) *************** elf_adjust_dynamic_symbol (h, data) *** 3602,3607 **** --- 3622,3630 ---- if (h->root.type == bfd_link_hash_indirect) return true; + if (! is_elf_hash_table (eif->info)) + return false; + /* Fix the symbol flags. */ if (! elf_fix_symbol_flags (h, eif)) return false; *************** elf_bfd_final_link (abfd, info) *** 4511,4516 **** --- 4534,4542 ---- boolean merged; size_t relativecount = 0; asection *reldyn = 0; + + if (! is_elf_hash_table (info)) + return false; if (info->shared) abfd->flags |= DYNAMIC;