summaryrefslogtreecommitdiff
path: root/bfd/mach-o.c
diff options
context:
space:
mode:
authoriains <iains>2012-01-03 13:18:46 +0000
committeriains <iains>2012-01-03 13:18:46 +0000
commita4ec1ff0dfe1893f282ee73beea33fe68439774b (patch)
tree8892ffb9e3b90152e8de3df1156c64e088cca29b /bfd/mach-o.c
parentb329ed8a6a2aef722ed2a017fb99016662177678 (diff)
downloadbinutils-redhat-a4ec1ff0dfe1893f282ee73beea33fe68439774b.tar.gz
support stabs on mach-o GAS.
bfd: * mach-o.c (bfd_mach_o_mangle_symbols): Put in the section index for stabd symbols. (bfd_mach_o_primary_symbol_sort_key): Adjust for stabs. (bfd_mach_o_cf_symbols): Likewise. gas: * config/obj-macho.c (obj_macho_process_stab): New. * config/obj-macho.h (OBJ_PROCESS_STAB): Define. (obj_macho_process_stab): Declare.
Diffstat (limited to 'bfd/mach-o.c')
-rw-r--r--bfd/mach-o.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index d534448d32..26fde7d60c 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -1625,19 +1625,25 @@ bfd_mach_o_write_dysymtab (bfd *abfd, bfd_mach_o_load_command *command)
}
static unsigned
-bfd_mach_o_primary_symbol_sort_key (unsigned type, unsigned ext)
+bfd_mach_o_primary_symbol_sort_key (unsigned type)
{
- /* TODO: Determine the correct ordering of stabs symbols. */
- /* We make indirect symbols a local/synthetic. */
- if (type == BFD_MACH_O_N_INDR)
+ unsigned mtyp = type & BFD_MACH_O_N_TYPE;
+
+ /* Just leave debug symbols where they are (pretend they are local, and
+ then they will just be sorted on position). */
+ if (type & BFD_MACH_O_N_STAB)
+ return 0;
+
+ /* Sort indirects to last. */
+ if (mtyp == BFD_MACH_O_N_INDR)
return 3;
/* Local (we should never see an undefined local AFAICT). */
- if (! ext)
+ if (! (type & (BFD_MACH_O_N_EXT | BFD_MACH_O_N_PEXT)))
return 0;
/* Common symbols look like undefined externs. */
- if (type == BFD_MACH_O_N_UNDF)
+ if (mtyp == BFD_MACH_O_N_UNDF)
return 2;
/* A defined symbol that's not indirect or extern. */
@@ -1651,19 +1657,15 @@ bfd_mach_o_cf_symbols (const void *a, const void *b)
bfd_mach_o_asymbol *sb = *(bfd_mach_o_asymbol **) b;
unsigned int soa, sob;
- soa = bfd_mach_o_primary_symbol_sort_key
- (sa->n_type & BFD_MACH_O_N_TYPE,
- sa->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT));
- sob = bfd_mach_o_primary_symbol_sort_key
- (sb->n_type & BFD_MACH_O_N_TYPE,
- sb->n_type & (BFD_MACH_O_N_PEXT | BFD_MACH_O_N_EXT));
+ soa = bfd_mach_o_primary_symbol_sort_key (sa->n_type);
+ sob = bfd_mach_o_primary_symbol_sort_key (sb->n_type);
if (soa < sob)
return -1;
if (soa > sob)
return 1;
- /* If it's local, just preserve the input order. */
+ /* If it's local or stab, just preserve the input order. */
if (soa == 0)
{
if (sa->symbol.udata.i < sb->symbol.udata.i)
@@ -1782,10 +1784,12 @@ bfd_mach_o_mangle_symbols (bfd *abfd, bfd_mach_o_data_struct *mdata)
}
/* Put the section index in, where required. */
- if (s->symbol.section != bfd_abs_section_ptr
+ if ((s->symbol.section != bfd_abs_section_ptr
&& s->symbol.section != bfd_und_section_ptr
&& s->symbol.section != bfd_com_section_ptr)
- s->n_sect = s->symbol.section->target_index;
+ || ((s->n_type & BFD_MACH_O_N_STAB) != 0
+ && s->symbol.name == NULL))
+ s->n_sect = s->symbol.section->target_index;
/* Unless we're looking at an indirect sym, note the input ordering.
We use this to keep local symbols ordered as per the input. */