diff options
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 4 | ||||
-rw-r--r-- | bfd/linker.c | 14 | ||||
-rw-r--r-- | bfd/section.c | 4 |
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) . */ |