summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog11
-rw-r--r--bfd/bfd-in2.h4
-rw-r--r--bfd/linker.c14
-rw-r--r--bfd/section.c4
4 files changed, 27 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7accdd9b0ed..365b7d931a9 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,14 @@
+2005-04-11 H.J. Lu <hongjiu.lu@intel.com>
+
+ * linker.c (_bfd_generic_link_output_symbols): Also check if
+ the output section of an input section has been removed from
+ the output file.
+
+ * section.c (bfd_section_list_remove): Clear the next field
+ of the removed section.
+ (bfd_section_removed_from_list): New.
+ * bfd-in2.h: Regenerated.
+
2005-04-11 David S. Miller <davem@davemloft.net>
* elf32-sparc.c (elf32_sparc_relocate_section,
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 626642045b2..bed224d34be 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1445,6 +1445,8 @@ extern const struct bfd_symbol * const bfd_ind_symbol;
*_ps = _s->next; \
if (_s->next == NULL) \
(ABFD)->section_tail = _ps; \
+ else \
+ _s->next = NULL; \
} \
while (0)
#define bfd_section_list_insert(ABFD, PS, S) \
@@ -1458,6 +1460,8 @@ extern const struct bfd_symbol * const bfd_ind_symbol;
(ABFD)->section_tail = &_s->next; \
} \
while (0)
+#define bfd_section_removed_from_list(ABFD, S) \
+ ((S)->next == NULL && &(S)->next != (ABFD)->section_tail)
void bfd_section_list_clear (bfd *);
diff --git a/bfd/linker.c b/bfd/linker.c
index f940d321bd0..89630c0e2f0 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -2363,12 +2363,14 @@ _bfd_generic_link_output_symbols (bfd *output_bfd,
abort ();
/* If this symbol is in a section which is not being included
- in the output file, then we don't want to output the symbol.
-
- Gross. .bss and similar sections won't have the linker_mark
- field set. */
- if ((sym->section->flags & SEC_HAS_CONTENTS) != 0
- && ! sym->section->linker_mark)
+ in the output file, then we don't want to output the
+ symbol. .bss and similar sections won't have the linker_mark
+ field set. We also check if its output section has been
+ removed from the output file. */
+ if (((sym->section->flags & SEC_HAS_CONTENTS) != 0
+ && ! sym->section->linker_mark)
+ || bfd_section_removed_from_list (output_bfd,
+ sym->section->output_section))
output = FALSE;
if (output)
diff --git a/bfd/section.c b/bfd/section.c
index 49a87035b74..914d1825007 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -546,6 +546,8 @@ CODE_FRAGMENT
. *_ps = _s->next; \
. if (_s->next == NULL) \
. (ABFD)->section_tail = _ps; \
+. else \
+. _s->next = NULL; \
. } \
. while (0)
.#define bfd_section_list_insert(ABFD, PS, S) \
@@ -559,6 +561,8 @@ CODE_FRAGMENT
. (ABFD)->section_tail = &_s->next; \
. } \
. while (0)
+.#define bfd_section_removed_from_list(ABFD, S) \
+. ((S)->next == NULL && &(S)->next != (ABFD)->section_tail)
.
*/