diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2005-04-05 04:01:12 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2005-04-05 04:01:12 +0000 |
commit | da9f89d4e2ddc91160b2056d290031afd868cb90 (patch) | |
tree | b2ca1cef314e46d027fe79e7aab804df3642c3ee /bfd/elfxx-ia64.c | |
parent | 7e4111adb2cc33e4770e634cd0039378e5b635e9 (diff) | |
download | ppe42-binutils-da9f89d4e2ddc91160b2056d290031afd868cb90.tar.gz ppe42-binutils-da9f89d4e2ddc91160b2056d290031afd868cb90.zip |
bfd/
2005-04-04 H.J. Lu <hongjiu.lu@intel.com>
* elf.c (bfd_elf_set_group_contents): Ignore linker created
group section.
(assign_section_numbers): Accept link_info. Check SHT_GROUP
sections for relocatable files only. Remove the linker created
group sections.
(_bfd_elf_compute_section_file_positions): Pass link_info to
assign_section_numbers.
* elfxx-ia64.c (elfNN_ia64_object_p): New.
(elf_backend_object_p): Defined.
gas/
2005-04-04 H.J. Lu <hongjiu.lu@intel.com>
* config/tc-ia64.c (start_unwind_section): Undo the change
of 2004-08-18.
(generate_unwind_image, dot_endp): Likewise.
Diffstat (limited to 'bfd/elfxx-ia64.c')
-rw-r--r-- | bfd/elfxx-ia64.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c index b19b172e6f..01e4d9f3aa 100644 --- a/bfd/elfxx-ia64.c +++ b/bfd/elfxx-ia64.c @@ -4886,6 +4886,103 @@ static struct bfd_elf_special_section const elfNN_ia64_special_sections[]= }; static bfd_boolean +elfNN_ia64_object_p (bfd *abfd) +{ + asection *sec; + asection **tail; + asection *group, *unwi, *unw; + flagword flags; + const char *name; + char *unwi_name, *unw_name; + bfd_size_type amt; + + if (abfd->flags & DYNAMIC) + return TRUE; + + /* Flags for fake group section. */ + flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE + | SEC_EXCLUDE); + + /* We add a fake section group for each .gnu.linkonce.t.* section, + which isn't in a section group, and its unwind sections. */ + for (sec = abfd->sections; sec != NULL; sec = sec->next) + { + if (elf_sec_group (sec) == NULL + && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP)) + == (SEC_LINK_ONCE | SEC_CODE)) + && strncmp (sec->name, ".gnu.linkonce.t.", 16) == 0) + { + name = sec->name + 16; + + amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi."); + unwi_name = bfd_alloc (abfd, amt); + if (!unwi_name) + return FALSE; + + strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name); + unwi = bfd_get_section_by_name (abfd, unwi_name); + + amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw."); + unw_name = bfd_alloc (abfd, amt); + if (!unw_name) + return FALSE; + + strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name); + unw = bfd_get_section_by_name (abfd, unw_name); + + tail = abfd->section_tail; + + /* We need to create a fake group section for it and its + unwind sections. */ + group = bfd_make_section_anyway (abfd, name); + if (group == NULL + || ! bfd_set_section_flags (abfd, group, flags)) + return FALSE; + + /* Move the fake group section to the beginning. */ + BFD_ASSERT (*tail == group); + bfd_section_list_remove (abfd, tail); + bfd_section_list_insert (abfd, &abfd->sections, group); + + elf_next_in_group (group) = sec; + + elf_group_name (sec) = name; + elf_next_in_group (sec) = sec; + elf_sec_group (sec) = group; + + if (unwi) + { + elf_group_name (unwi) = name; + elf_next_in_group (unwi) = sec; + elf_next_in_group (sec) = unwi; + elf_sec_group (unwi) = group; + } + + if (unw) + { + elf_group_name (unw) = name; + if (unwi) + { + elf_next_in_group (unw) = elf_next_in_group (unwi); + elf_next_in_group (unwi) = unw; + } + else + { + elf_next_in_group (unw) = sec; + elf_next_in_group (sec) = unw; + } + elf_sec_group (unw) = group; + } + + /* Fake SHT_GROUP section header. */ + elf_section_data (group)->this_hdr.bfd_section = group; + elf_section_data (group)->this_hdr.sh_type = SHT_GROUP; + } + } + return TRUE; +} + +static bfd_boolean elfNN_ia64_hpux_vec (const bfd_target *vec) { extern const bfd_target bfd_elfNN_ia64_hpux_big_vec; @@ -4968,6 +5065,9 @@ elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, #define bfd_elfNN_bfd_relax_section \ elfNN_ia64_relax_section +#define elf_backend_object_p \ + elfNN_ia64_object_p + /* Stuff for the BFD linker: */ #define bfd_elfNN_bfd_link_hash_table_create \ elfNN_ia64_hash_table_create |