* bfd-elf.h (elf_backend_name_local_section_symbols): New hook.
* elf.c (swap_out_syms): Use it to decide whether local section symbols should be named. * elfxx-target.h (elf_backend_name_local_section_symbols): New macro. * elfxx-mips.h (_bfd_mips_elf_name_local_section_symbols): Declare. (elf_backend_name_local_section_symbols): Define. * elfxx-mips.c (_bfd_mips_elf_name_local_section_symbols): New.
This commit is contained in:
parent
edfae06341
commit
174fd7f955
@ -1,3 +1,13 @@
|
|||||||
|
2004-02-09 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
|
* bfd-elf.h (elf_backend_name_local_section_symbols): New hook.
|
||||||
|
* elf.c (swap_out_syms): Use it to decide whether local section
|
||||||
|
symbols should be named.
|
||||||
|
* elfxx-target.h (elf_backend_name_local_section_symbols): New macro.
|
||||||
|
* elfxx-mips.h (_bfd_mips_elf_name_local_section_symbols): Declare.
|
||||||
|
(elf_backend_name_local_section_symbols): Define.
|
||||||
|
* elfxx-mips.c (_bfd_mips_elf_name_local_section_symbols): New.
|
||||||
|
|
||||||
2004-01-30 H.J. Lu <hongjiu.lu@intel.com>
|
2004-01-30 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elfxx-ia64.c (elfNN_ia64_relax_brl): New function.
|
* elfxx-ia64.c (elfNN_ia64_relax_brl): New function.
|
||||||
|
@ -576,6 +576,11 @@ struct elf_backend_data
|
|||||||
int (*elf_backend_get_symbol_type)
|
int (*elf_backend_get_symbol_type)
|
||||||
(Elf_Internal_Sym *, int);
|
(Elf_Internal_Sym *, int);
|
||||||
|
|
||||||
|
/* Return true if local section symbols should have a non-null st_name.
|
||||||
|
NULL implies false. */
|
||||||
|
bfd_boolean (*elf_backend_name_local_section_symbols)
|
||||||
|
(bfd *);
|
||||||
|
|
||||||
/* A function to do additional processing on the ELF section header
|
/* A function to do additional processing on the ELF section header
|
||||||
just before writing it out. This is used to set the flags and
|
just before writing it out. This is used to set the flags and
|
||||||
type fields for some sections, or to actually write out data for
|
type fields for some sections, or to actually write out data for
|
||||||
|
@ -5261,6 +5261,7 @@ swap_out_syms (bfd *abfd,
|
|||||||
char *outbound_shndx;
|
char *outbound_shndx;
|
||||||
int idx;
|
int idx;
|
||||||
bfd_size_type amt;
|
bfd_size_type amt;
|
||||||
|
bfd_boolean name_local_sections;
|
||||||
|
|
||||||
if (!elf_map_symbols (abfd))
|
if (!elf_map_symbols (abfd))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -5326,6 +5327,10 @@ swap_out_syms (bfd *abfd,
|
|||||||
outbound_shndx += sizeof (Elf_External_Sym_Shndx);
|
outbound_shndx += sizeof (Elf_External_Sym_Shndx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
name_local_sections
|
||||||
|
= (bed->elf_backend_name_local_section_symbols
|
||||||
|
&& bed->elf_backend_name_local_section_symbols (abfd));
|
||||||
|
|
||||||
syms = bfd_get_outsymbols (abfd);
|
syms = bfd_get_outsymbols (abfd);
|
||||||
for (idx = 0; idx < symcount; idx++)
|
for (idx = 0; idx < symcount; idx++)
|
||||||
{
|
{
|
||||||
@ -5335,7 +5340,8 @@ swap_out_syms (bfd *abfd,
|
|||||||
flagword flags = syms[idx]->flags;
|
flagword flags = syms[idx]->flags;
|
||||||
int type;
|
int type;
|
||||||
|
|
||||||
if ((flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
|
if (!name_local_sections
|
||||||
|
&& (flags & (BSF_SECTION_SYM | BSF_GLOBAL)) == BSF_SECTION_SYM)
|
||||||
{
|
{
|
||||||
/* Local section symbols have no name. */
|
/* Local section symbols have no name. */
|
||||||
sym.st_name = 0;
|
sym.st_name = 0;
|
||||||
|
@ -4271,6 +4271,26 @@ _bfd_mips_elf_symbol_processing (bfd *abfd, asymbol *asym)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* There appears to be a bug in the MIPSpro linker that causes GOT_DISP
|
||||||
|
relocations against two unnamed section symbols to resolve to the
|
||||||
|
same address. For example, if we have code like:
|
||||||
|
|
||||||
|
lw $4,%got_disp(.data)($gp)
|
||||||
|
lw $25,%got_disp(.text)($gp)
|
||||||
|
jalr $25
|
||||||
|
|
||||||
|
then the linker will resolve both relocations to .data and the program
|
||||||
|
will jump there rather than to .text.
|
||||||
|
|
||||||
|
We can work around this problem by giving names to local section symbols.
|
||||||
|
This is also what the MIPSpro tools do. */
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
_bfd_mips_elf_name_local_section_symbols (bfd *abfd)
|
||||||
|
{
|
||||||
|
return SGI_COMPAT (abfd);
|
||||||
|
}
|
||||||
|
|
||||||
/* Work over a section just before writing it out. This routine is
|
/* Work over a section just before writing it out. This routine is
|
||||||
used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
|
used by both the 32-bit and the 64-bit ABI. FIXME: We recognize
|
||||||
sections that need the SHF_MIPS_GPREL flag by name; there has to be
|
sections that need the SHF_MIPS_GPREL flag by name; there has to be
|
||||||
|
@ -24,6 +24,8 @@ extern bfd_boolean _bfd_mips_elf_new_section_hook
|
|||||||
(bfd *, asection *);
|
(bfd *, asection *);
|
||||||
extern void _bfd_mips_elf_symbol_processing
|
extern void _bfd_mips_elf_symbol_processing
|
||||||
(bfd *, asymbol *);
|
(bfd *, asymbol *);
|
||||||
|
extern bfd_boolean _bfd_mips_elf_name_local_section_symbols
|
||||||
|
(bfd *);
|
||||||
extern bfd_boolean _bfd_mips_elf_section_processing
|
extern bfd_boolean _bfd_mips_elf_section_processing
|
||||||
(bfd *, Elf_Internal_Shdr *);
|
(bfd *, Elf_Internal_Shdr *);
|
||||||
extern bfd_boolean _bfd_mips_elf_section_from_shdr
|
extern bfd_boolean _bfd_mips_elf_section_from_shdr
|
||||||
@ -119,4 +121,6 @@ extern bfd_vma _bfd_mips_elf_sign_extend
|
|||||||
(bfd_vma, int);
|
(bfd_vma, int);
|
||||||
|
|
||||||
extern struct bfd_elf_special_section const _bfd_mips_elf_special_sections[];
|
extern struct bfd_elf_special_section const _bfd_mips_elf_special_sections[];
|
||||||
|
#define elf_backend_name_local_section_symbols \
|
||||||
|
_bfd_mips_elf_name_local_section_symbols
|
||||||
#define elf_backend_special_sections _bfd_mips_elf_special_sections
|
#define elf_backend_special_sections _bfd_mips_elf_special_sections
|
||||||
|
@ -274,6 +274,9 @@
|
|||||||
#ifndef elf_backend_get_symbol_type
|
#ifndef elf_backend_get_symbol_type
|
||||||
#define elf_backend_get_symbol_type 0
|
#define elf_backend_get_symbol_type 0
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef elf_backend_name_local_section_symbols
|
||||||
|
#define elf_backend_name_local_section_symbols 0
|
||||||
|
#endif
|
||||||
#ifndef elf_backend_section_processing
|
#ifndef elf_backend_section_processing
|
||||||
#define elf_backend_section_processing 0
|
#define elf_backend_section_processing 0
|
||||||
#endif
|
#endif
|
||||||
@ -456,6 +459,7 @@ static const struct elf_backend_data elfNN_bed =
|
|||||||
elf_backend_symbol_processing,
|
elf_backend_symbol_processing,
|
||||||
elf_backend_symbol_table_processing,
|
elf_backend_symbol_table_processing,
|
||||||
elf_backend_get_symbol_type,
|
elf_backend_get_symbol_type,
|
||||||
|
elf_backend_name_local_section_symbols,
|
||||||
elf_backend_section_processing,
|
elf_backend_section_processing,
|
||||||
elf_backend_section_from_shdr,
|
elf_backend_section_from_shdr,
|
||||||
elf_backend_section_flags,
|
elf_backend_section_flags,
|
||||||
|
Loading…
Reference in New Issue
Block a user