From: Alan Modra Date: Wed, 26 May 2004 10:23:51 +0000 (+0000) Subject: bfd/ X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e49f502242bc5fc72547397cd344aea5b9f53a14;p=binutils-gdb.git bfd/ * elf.c (_bfd_elf_make_section_from_shdr): Don't set SEC_EXCLUDE for SHT_GROUP sections. ld/ * ldlang.c (lang_add_section): Set SEC_EXCLUDE for SEC_GROUP sections when doing a final link. Clear SEC_EXCLUDE when doing a relocable link, except for SEC_DEBUGGING sections. * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Use the same condition here to drop SEC_EXCLUDE orphan sections. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 93ae1f66dd3..a771b9afcd5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2004-05-26 Alan Modra + + * elf.c (_bfd_elf_make_section_from_shdr): Don't set SEC_EXCLUDE + for SHT_GROUP sections. + 2004-05-25 Alan Modra * elflink.c (elf_link_add_object_symbols): Don't set up merge diff --git a/bfd/elf.c b/bfd/elf.c index 93a3d3ac9f8..61f5f578368 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -677,7 +677,7 @@ _bfd_elf_make_section_from_shdr (bfd *abfd, if (hdr->sh_type != SHT_NOBITS) flags |= SEC_HAS_CONTENTS; if (hdr->sh_type == SHT_GROUP) - flags |= SEC_GROUP | SEC_EXCLUDE; + flags |= SEC_GROUP; if ((hdr->sh_flags & SHF_ALLOC) != 0) { flags |= SEC_ALLOC; diff --git a/ld/ChangeLog b/ld/ChangeLog index d923216dec6..6c34103c7c4 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2004-05-26 Alan Modra + + * ldlang.c (lang_add_section): Set SEC_EXCLUDE for SEC_GROUP + sections when doing a final link. Clear SEC_EXCLUDE when doing + a relocable link, except for SEC_DEBUGGING sections. + * emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Use the + same condition here to drop SEC_EXCLUDE orphan sections. + 2004-05-25 Alan Modra * ldlang.c (lang_process): Call bfd_merge_sections later, and diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index cf002e50286..89c5d5d0e55 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -1182,7 +1182,9 @@ gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s) #define HAVE_SECTION(hold, name) \ (hold.os != NULL || (hold.os = lang_output_section_find (name)) != NULL) - if ((s->flags & SEC_EXCLUDE) != 0 && !link_info.relocatable) + if (((s->flags & (SEC_EXCLUDE | SEC_GROUP)) != 0 && !link_info.relocatable) + || ((s->flags & (SEC_EXCLUDE | SEC_DEBUGGING)) + == (SEC_EXCLUDE | SEC_DEBUGGING))) { if (s->output_section == NULL) s->output_section = bfd_abs_section_ptr; diff --git a/ld/ldlang.c b/ld/ldlang.c index 7a268c0eb24..34cff0f762a 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1096,11 +1096,26 @@ lang_add_section (lang_statement_list_type *ptr, discard = FALSE; - /* Discard sections marked with SEC_EXCLUDE if we are doing a final - link. Discard debugging sections marked with SEC_EXCLUDE on a - relocatable link too. */ - if ((flags & SEC_EXCLUDE) != 0 - && ((flags & SEC_DEBUGGING) != 0 || !link_info.relocatable)) + if (link_info.relocatable) + { + /* SEC_EXCLUDE is ignored when doing a relocatable link, + except in the special case of debug info. (See bfd/stabs.c) */ + if ((flags & SEC_DEBUGGING) == 0) + flags &= ~SEC_EXCLUDE; + } + else + { + /* SEC_GROUP sections should be dropped on a final link. */ + if ((flags & SEC_GROUP) != 0) + flags |= SEC_EXCLUDE; + } + + /* Write SEC_EXCLUDE flag back, to simplify later linker code. */ + if (section->owner != NULL) + bfd_set_section_flags (section->owner, section, flags); + + /* Discard sections marked with SEC_EXCLUDE. */ + if ((flags & SEC_EXCLUDE) != 0) discard = TRUE; /* Discard input sections which are assigned to a section named