* section.c (_bfd_strip_section_from_output): Add info parameter.

If it passed as non-NULL, use it to check whether any input BFD
	has an input section which uses this output section.  Change all
	callers.
	* bfd-in2.h: Rebuild.

	* bfd-in.h: Move declarations of bfd_get_elf_phdr_upper_bound and
	bfd_get_elf_phdrs in from bfd-in2.h, correcting patch of
	1999-11-29.
	* bfd-in2.h: Rebuild.
This commit is contained in:
Ian Lance Taylor 2000-02-13 22:45:29 +00:00
parent e3c976c4eb
commit 7f8d5fc90b
12 changed files with 91 additions and 38 deletions

View file

@ -1,3 +1,16 @@
2000-02-13 Ian Lance Taylor <ian@zembu.com>
* section.c (_bfd_strip_section_from_output): Add info parameter.
If it passed as non-NULL, use it to check whether any input BFD
has an input section which uses this output section. Change all
callers.
* bfd-in2.h: Rebuild.
* bfd-in.h: Move declarations of bfd_get_elf_phdr_upper_bound and
bfd_get_elf_phdrs in from bfd-in2.h, correcting patch of
1999-11-29.
* bfd-in2.h: Rebuild.
2000-02-10 Timothy Wall <twall@cygnus.com> 2000-02-10 Timothy Wall <twall@cygnus.com>
* coffswap.h (coff_swap_sym_in): Add hook SWAP_SYM_IN_POST to * coffswap.h (coff_swap_sym_in): Add hook SWAP_SYM_IN_POST to

View file

@ -626,6 +626,20 @@ extern boolean bfd_elf64_size_dynamic_sections
extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *));
extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *)); extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *));
/* Return an upper bound on the number of bytes required to store a
copy of ABFD's program header table entries. Return -1 if an error
occurs; bfd_get_error will return an appropriate code. */
extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd));
/* Copy ABFD's program header table entries to *PHDRS. The entries
will be stored as an array of Elf_Internal_Phdr structures, as
defined in include/elf/internal.h. To find out how large the
buffer needs to be, call bfd_get_elf_phdr_upper_bound.
Return the number of program header table entries read, or -1 if an
error occurs; bfd_get_error will return an appropriate code. */
extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs));
/* SunOS shared library support routines for the linker. */ /* SunOS shared library support routines for the linker. */
extern struct bfd_link_needed_list *bfd_sunos_get_needed_list extern struct bfd_link_needed_list *bfd_sunos_get_needed_list

View file

@ -626,6 +626,20 @@ extern boolean bfd_elf64_size_dynamic_sections
extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *)); extern void bfd_elf_set_dt_needed_name PARAMS ((bfd *, const char *));
extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *)); extern const char *bfd_elf_get_dt_soname PARAMS ((bfd *));
/* Return an upper bound on the number of bytes required to store a
copy of ABFD's program header table entries. Return -1 if an error
occurs; bfd_get_error will return an appropriate code. */
extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd));
/* Copy ABFD's program header table entries to *PHDRS. The entries
will be stored as an array of Elf_Internal_Phdr structures, as
defined in include/elf/internal.h. To find out how large the
buffer needs to be, call bfd_get_elf_phdr_upper_bound.
Return the number of program header table entries read, or -1 if an
error occurs; bfd_get_error will return an appropriate code. */
extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs));
/* SunOS shared library support routines for the linker. */ /* SunOS shared library support routines for the linker. */
extern struct bfd_link_needed_list *bfd_sunos_get_needed_list extern struct bfd_link_needed_list *bfd_sunos_get_needed_list
@ -1084,7 +1098,7 @@ typedef struct sec
target). In most cases, if this was going to start at the target). In most cases, if this was going to start at the
100th octet (8-bit quantity) in the output section, this value 100th octet (8-bit quantity) in the output section, this value
would be 100. However, if the target byte size is 16 bits would be 100. However, if the target byte size is 16 bits
(bfd_octets_per_byte is "2"), this value would be 50. */ (bfd_octets_per_byte is "2"), this value would be 50. */
bfd_vma output_offset; bfd_vma output_offset;
@ -1254,7 +1268,7 @@ bfd_copy_private_section_data PARAMS ((bfd *ibfd, asection *isec, bfd *obfd, ase
(ibfd, isection, obfd, osection)) (ibfd, isection, obfd, osection))
void void
_bfd_strip_section_from_output _bfd_strip_section_from_output
PARAMS ((asection *section)); PARAMS ((struct bfd_link_info *info, asection *section));
enum bfd_architecture enum bfd_architecture
{ {
@ -1379,7 +1393,7 @@ enum bfd_architecture
bfd_arch_mn10200, /* Matsushita MN10200 */ bfd_arch_mn10200, /* Matsushita MN10200 */
bfd_arch_mn10300, /* Matsushita MN10300 */ bfd_arch_mn10300, /* Matsushita MN10300 */
#define bfd_mach_mn10300 300 #define bfd_mach_mn10300 300
#define bfd_mach_am33 330 #define bfd_mach_am33 330
bfd_arch_fr30, bfd_arch_fr30,
#define bfd_mach_fr30 0x46523330 #define bfd_mach_fr30 0x46523330
bfd_arch_mcore, bfd_arch_mcore,
@ -1454,7 +1468,7 @@ bfd_octets_per_byte PARAMS ((bfd *abfd));
int int
bfd_arch_mach_octets_per_byte PARAMS ((enum bfd_architecture arch, bfd_arch_mach_octets_per_byte PARAMS ((enum bfd_architecture arch,
unsigned long machine)); unsigned long machine));
typedef enum bfd_reloc_status typedef enum bfd_reloc_status
{ {
@ -2433,8 +2447,8 @@ bfd_print_symbol_vandf PARAMS ((PTR file, asymbol *symbol));
int int
bfd_decode_symclass PARAMS ((asymbol *symbol)); bfd_decode_symclass PARAMS ((asymbol *symbol));
boolean boolean
bfd_is_undefined_symclass PARAMS ((int symclass)); bfd_is_undefined_symclass PARAMS ((int symclass));
void void
bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret)); bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret));
@ -3105,22 +3119,6 @@ bfd_set_format PARAMS ((bfd *abfd, bfd_format format));
CONST char * CONST char *
bfd_format_string PARAMS ((bfd_format format)); bfd_format_string PARAMS ((bfd_format format));
/* Return an upper bound on the number of bytes required to store a
copy of ABFD's program header table entries. Return -1 if an error
occurs; bfd_get_error will return an appropriate code. */
extern long bfd_get_elf_phdr_upper_bound PARAMS ((bfd *abfd));
/* Copy ABFD's program header table entries to *PHDRS. The entries
will be stored as an array of Elf_Internal_Phdr structures, as
defined in include/elf/internal.h. To find out how large the
buffer needs to be, call bfd_get_elf_phdr_upper_bound.
Return the number of program header table entries read, or -1 if an
error occurs; bfd_get_error will return an appropriate code. */
extern int bfd_get_elf_phdrs PARAMS ((bfd *abfd, void *phdrs));
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -1085,7 +1085,7 @@ elf_i386_size_dynamic_sections (output_bfd, info)
if (strip) if (strip)
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
continue; continue;
} }

View file

@ -1262,7 +1262,7 @@ elf_m68k_size_dynamic_sections (output_bfd, info)
if (strip) if (strip)
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
continue; continue;
} }

View file

@ -7920,7 +7920,7 @@ _bfd_mips_elf_size_dynamic_sections (output_bfd, info)
if (strip) if (strip)
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
continue; continue;
} }

View file

@ -2012,7 +2012,7 @@ ppc_elf_size_dynamic_sections (output_bfd, info)
if (strip) if (strip)
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
continue; continue;
} }

View file

@ -1010,7 +1010,7 @@ elf32_sparc_size_dynamic_sections (output_bfd, info)
if (strip) if (strip)
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
continue; continue;
} }

View file

@ -3263,7 +3263,7 @@ elf64_alpha_size_dynamic_sections (output_bfd, info)
} }
if (strip) if (strip)
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
else else
{ {
/* Allocate memory for the section contents. */ /* Allocate memory for the section contents. */

View file

@ -1752,7 +1752,7 @@ sparc64_elf_size_dynamic_sections (output_bfd, info)
if (strip) if (strip)
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
continue; continue;
} }

View file

@ -2981,7 +2981,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
verdefs = asvinfo.verdefs; verdefs = asvinfo.verdefs;
if (verdefs == NULL) if (verdefs == NULL)
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
else else
{ {
unsigned int cdefs; unsigned int cdefs;
@ -3157,7 +3157,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
(PTR) &sinfo); (PTR) &sinfo);
if (elf_tdata (output_bfd)->verref == NULL) if (elf_tdata (output_bfd)->verref == NULL)
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
else else
{ {
Elf_Internal_Verneed *t; Elf_Internal_Verneed *t;
@ -3261,7 +3261,7 @@ NAME(bfd_elf,size_dynamic_sections) (output_bfd, soname, rpath,
if (dynsymcount == 0 if (dynsymcount == 0
|| (verdefs == NULL && elf_tdata (output_bfd)->verref == NULL)) || (verdefs == NULL && elf_tdata (output_bfd)->verref == NULL))
{ {
_bfd_strip_section_from_output (s); _bfd_strip_section_from_output (info, s);
/* The DYNSYMCOUNT might have changed if we were going to /* The DYNSYMCOUNT might have changed if we were going to
output a dynamic symbol table entry for S. */ output a dynamic symbol table entry for S. */
dynsymcount = _bfd_elf_link_renumber_dynsyms (output_bfd, info); dynsymcount = _bfd_elf_link_renumber_dynsyms (output_bfd, info);

View file

@ -1100,20 +1100,28 @@ FUNCTION
SYNOPSIS SYNOPSIS
void _bfd_strip_section_from_output void _bfd_strip_section_from_output
(asection *section); (struct bfd_link_info *info, asection *section);
DESCRIPTION DESCRIPTION
Remove @var{section} from the output. If the output section becomes Remove @var{section} from the output. If the output section
empty, remove it from the output bfd. becomes empty, remove it from the output bfd. @var{info} may
be NULL; if it is not, it is used to decide whether the output
section is empty.
*/ */
void void
_bfd_strip_section_from_output (s) _bfd_strip_section_from_output (info, s)
struct bfd_link_info *info;
asection *s; asection *s;
{ {
asection **spp, *os; asection **spp, *os;
struct bfd_link_order *p, *pp; struct bfd_link_order *p, *pp;
boolean keep_os;
/* Excise the input section from the link order. */ /* Excise the input section from the link order.
FIXME: For all calls that I can see to this function, the link
orders have not yet been set up. So why are we checking them? --
Ian */
os = s->output_section; os = s->output_section;
for (p = os->link_order_head, pp = NULL; p != NULL; pp = p, p = p->next) for (p = os->link_order_head, pp = NULL; p != NULL; pp = p, p = p->next)
if (p->type == bfd_indirect_link_order if (p->type == bfd_indirect_link_order
@ -1128,10 +1136,30 @@ _bfd_strip_section_from_output (s)
break; break;
} }
keep_os = os->link_order_head != NULL;
if (! keep_os && info != NULL)
{
bfd *abfd;
for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link_next)
{
asection *is;
for (is = abfd->sections; is != NULL; is = is->next)
{
if (is != s && is->output_section == os)
break;
}
if (is != NULL)
break;
}
if (abfd != NULL)
keep_os = true;
}
/* If the output section is empty, remove it too. Careful about sections /* If the output section is empty, remove it too. Careful about sections
that have been discarded in the link script -- they are mapped to that have been discarded in the link script -- they are mapped to
bfd_abs_section, which has no owner. */ bfd_abs_section, which has no owner. */
if (!os->link_order_head && os->owner) if (!keep_os && os->owner != NULL)
{ {
for (spp = &os->owner->sections; *spp; spp = &(*spp)->next) for (spp = &os->owner->sections; *spp; spp = &(*spp)->next)
if (*spp == os) if (*spp == os)