mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-01-23 01:35:34 +00:00
PR 1150
* readelf.c (get_mips_symbol_other): New function. (get_symbol_other): New function. (process_symbol_table): Call get_symbol_other() to get a description of the st_other field if it contains more information than just the visibility. * elfxx-mips.c (mips_elf_calculate_relocation): Ignore an undefined symbol if it is optional. (_bfd_mips_elf_merge_symbol_attribute): Make sure that the optional flag is merged as well as the visibility. * elfxx-mips.h (_bfd_mips_elf_merge_symbol_attribute): Prototype. (elf_backend_merge_symbol_attribute): Define. * mips.h (STO_OPTIONAL): Define. (ELF_MIPS_IS_OPTIONAL): Define.
This commit is contained in:
parent
ff1e98b937
commit
5e2b0d475e
@ -1,3 +1,13 @@
|
||||
2005-11-11 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 1150
|
||||
* elfxx-mips.c (mips_elf_calculate_relocation): Ignore an
|
||||
undefined symbol if it is optional.
|
||||
(_bfd_mips_elf_merge_symbol_attribute): Make sure that the
|
||||
optional flag is merged as well as the visibility.
|
||||
* elfxx-mips.h (_bfd_mips_elf_merge_symbol_attribute): Prototype.
|
||||
(elf_backend_merge_symbol_attribute): Define.
|
||||
|
||||
2005-11-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
Add ms2 support
|
||||
|
@ -3792,6 +3792,17 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
|
||||
BFD_ASSERT (bfd_get_section_by_name (abfd, ".dynamic") == NULL);
|
||||
symbol = 0;
|
||||
}
|
||||
else if (ELF_MIPS_IS_OPTIONAL (h->root.other))
|
||||
{
|
||||
/* This is an optional symbol - an Irix specific extension to the
|
||||
ELF spec. Ignore it for now.
|
||||
XXX - FIXME - there is more to the spec for OPTIONAL symbols
|
||||
than simply ignoring them, but we do not handle this for now.
|
||||
For information see the "64-bit ELF Object File Specification"
|
||||
which is available from here:
|
||||
http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf */
|
||||
symbol = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! ((*info->callbacks->undefined_symbol)
|
||||
@ -8867,8 +8878,7 @@ _bfd_elf_mips_get_relocated_section_contents
|
||||
case bfd_reloc_undefined:
|
||||
if (!((*link_info->callbacks->undefined_symbol)
|
||||
(link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
|
||||
input_bfd, input_section, (*parent)->address,
|
||||
TRUE)))
|
||||
input_bfd, input_section, (*parent)->address, TRUE)))
|
||||
goto error_return;
|
||||
break;
|
||||
case bfd_reloc_dangerous:
|
||||
@ -9994,3 +10004,16 @@ const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] =
|
||||
{ ".ucode", 6, 0, SHT_MIPS_UCODE, 0 },
|
||||
{ NULL, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
/* Ensure that the STO_OPTIONAL flag is copied into h->other,
|
||||
even if this is not a defintion of the symbol. */
|
||||
void
|
||||
_bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
|
||||
const Elf_Internal_Sym *isym,
|
||||
bfd_boolean definition,
|
||||
bfd_boolean dynamic ATTRIBUTE_UNUSED)
|
||||
{
|
||||
if (! definition
|
||||
&& ELF_MIPS_IS_OPTIONAL (isym->st_other))
|
||||
h->other |= STO_OPTIONAL;
|
||||
}
|
||||
|
@ -127,6 +127,8 @@ extern bfd_boolean _bfd_mips_relax_section
|
||||
(bfd *, asection *, struct bfd_link_info *, bfd_boolean *);
|
||||
extern bfd_vma _bfd_mips_elf_sign_extend
|
||||
(bfd_vma, int);
|
||||
extern void _bfd_mips_elf_merge_symbol_attribute
|
||||
(struct elf_link_hash_entry *, const Elf_Internal_Sym *, bfd_boolean, bfd_boolean);
|
||||
|
||||
extern const struct bfd_elf_special_section _bfd_mips_elf_special_sections [];
|
||||
|
||||
@ -134,3 +136,4 @@ extern const struct bfd_elf_special_section _bfd_mips_elf_special_sections [];
|
||||
_bfd_mips_elf_name_local_section_symbols
|
||||
#define elf_backend_special_sections _bfd_mips_elf_special_sections
|
||||
#define elf_backend_eh_frame_address_size _bfd_mips_elf_eh_frame_address_size
|
||||
#define elf_backend_merge_symbol_attribute _bfd_mips_elf_merge_symbol_attribute
|
||||
|
@ -1,3 +1,12 @@
|
||||
2005-11-11 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 1150
|
||||
* readelf.c (get_mips_symbol_other): New function.
|
||||
(get_symbol_other): New function.
|
||||
(process_symbol_table): Call get_symbol_other() to get a
|
||||
description of the st_other field if it contains more information
|
||||
than just the visibility.
|
||||
|
||||
2005-11-07 Steve Ellcey <sje@cup.hp.com>
|
||||
|
||||
* configure: Regenerate after modifying bfd/warning.m4.
|
||||
|
@ -6689,6 +6689,41 @@ get_symbol_visibility (unsigned int visibility)
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_mips_symbol_other (unsigned int other)
|
||||
{
|
||||
switch (other)
|
||||
{
|
||||
case STO_OPTIONAL: return "OPTIONAL";
|
||||
case STO_MIPS16: return "MIPS16";
|
||||
default: return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_symbol_other (unsigned int other)
|
||||
{
|
||||
const char * result = NULL;
|
||||
static char buff [32];
|
||||
|
||||
if (other == 0)
|
||||
return "";
|
||||
|
||||
switch (elf_header.e_machine)
|
||||
{
|
||||
case EM_MIPS:
|
||||
result = get_mips_symbol_other (other);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
snprintf (buff, sizeof buff, _("<other>: %x"), other);
|
||||
return buff;
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_symbol_index_type (unsigned int type)
|
||||
{
|
||||
@ -6851,6 +6886,11 @@ process_symbol_table (FILE *file)
|
||||
printf (" %6s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
|
||||
printf (" %6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
|
||||
printf (" %3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
|
||||
/* Check to see if any other bits in the st_other field are set.
|
||||
Note - displaying this information disrupts the layout of the
|
||||
table being generated, but for the moment this case is very rare. */
|
||||
if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
|
||||
printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
|
||||
printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
|
||||
if (VALID_DYNAMIC_NAME (psym->st_name))
|
||||
print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
|
||||
@ -6918,6 +6958,11 @@ process_symbol_table (FILE *file)
|
||||
printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
|
||||
printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
|
||||
printf (" %-3s", get_symbol_visibility (ELF_ST_VISIBILITY (psym->st_other)));
|
||||
/* Check to see if any other bits in the st_other field are set.
|
||||
Note - displaying this information disrupts the layout of the
|
||||
table being generated, but for the moment this case is very rare. */
|
||||
if (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other))
|
||||
printf (" [%s] ", get_symbol_other (psym->st_other ^ ELF_ST_VISIBILITY (psym->st_other)));
|
||||
printf (" %4s ", get_symbol_index_type (psym->st_shndx));
|
||||
print_symbol (25, psym->st_name < strtab_size
|
||||
? strtab + psym->st_name : "<corrupt>");
|
||||
|
@ -1,3 +1,9 @@
|
||||
2005-11-11 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
PR 1150
|
||||
* mips.h (STO_OPTIONAL): Define.
|
||||
(ELF_MIPS_IS_OPTIONAL): Define.
|
||||
|
||||
2005-09-30 Catherine Moore <clm@cm00re.com>
|
||||
|
||||
* bfin.h: New file.
|
||||
|
@ -718,6 +718,13 @@ extern void bfd_mips_elf32_swap_reginfo_out
|
||||
|
||||
/* This value is used for a mips16 .text symbol. */
|
||||
#define STO_MIPS16 0xf0
|
||||
|
||||
/* This bit is used on Irix to indicate a symbol whose definition
|
||||
is optional - if, at final link time, it cannot be found, no
|
||||
error message should be produced. */
|
||||
#define STO_OPTIONAL (1 << 2)
|
||||
/* A macro to examine the STO_OPTIONAL bit. */
|
||||
#define ELF_MIPS_IS_OPTIONAL(other) ((other) & STO_OPTIONAL)
|
||||
|
||||
/* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each
|
||||
relocation entry specifies up to three actual relocations, all at
|
||||
|
Loading…
x
Reference in New Issue
Block a user