From 68588f95404f3301816c765ecd617a585ad50bac Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Tue, 3 Jan 2012 13:18:48 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 7 +++++++ bfd/mach-o.c | 34 +++++++++++++++++++--------------- gas/ChangeLog | 6 ++++++ gas/config/obj-macho.c | 42 +++++++++++++++++++++++++++++++++++++++++- gas/config/obj-macho.h | 5 ++++- 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f0df80c61d3..f44a7f8d562 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2012-01-03 Iain Sandoe + + * 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. + 2012-01-03 Iain Sandoe * mach-o.c (bfd_mach_o_mangle_symbols): Correct typo. diff --git a/bfd/mach-o.c b/bfd/mach-o.c index d534448d328..26fde7d60ce 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. */ diff --git a/gas/ChangeLog b/gas/ChangeLog index 26e4fc5dcac..6fecce61dc3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2012-01-03 Iain Sandoe + + * config/obj-macho.c (obj_macho_process_stab): New. + * config/obj-macho.h (OBJ_PROCESS_STAB): Define. + (obj_macho_process_stab): Declare. + 2011-12-29 Iain Sandoe * as.c (perform_an_assembly_pass): Do not create text, data and bss diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index 74fb0c910ae..16ceb5eeeca 100644 --- a/gas/config/obj-macho.c +++ b/gas/config/obj-macho.c @@ -1,5 +1,5 @@ /* Mach-O object file format - Copyright 2009, 2011 Free Software Foundation, Inc. + Copyright 2009, 2011, 2012 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -850,3 +850,43 @@ const pseudo_typeS mach_o_pseudo_table[] = {NULL, NULL, 0} }; + +/* Support stabs for mach-o. */ + +void +obj_mach_o_process_stab (int what, const char *string, + int type, int other, int desc) +{ + symbolS *symbolP; + bfd_mach_o_asymbol *s; + + switch (what) + { + case 'd': + symbolP = symbol_new ("", now_seg, frag_now_fix (), frag_now); + /* Special stabd NULL name indicator. */ + S_SET_NAME (symbolP, NULL); + break; + + case 'n': + case 's': + symbolP = symbol_new (string, undefined_section, (valueT) 0, + &zero_address_frag); + pseudo_set (symbolP); + break; + + default: + as_bad(_("unrecognized stab type '%c'"), (char)what); + abort (); + break; + } + + s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (symbolP); + s->n_type = type; + s->n_desc = desc; + /* For stabd, this will eventually get overwritten by the section number. */ + s->n_sect = other; + + /* It's a debug symbol. */ + s->symbol.flags |= BSF_DEBUGGING; +} diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h index d9b0b330261..b2acd17c63c 100644 --- a/gas/config/obj-macho.h +++ b/gas/config/obj-macho.h @@ -1,5 +1,5 @@ /* Mach-O object file format for gas, the assembler. - Copyright 2009, 2011 Free Software Foundation, Inc. + Copyright 2009, 2011, 2012 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -58,4 +58,7 @@ extern const pseudo_typeS mach_o_pseudo_table[]; #define EMIT_SECTION_SYMBOLS 0 +#define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) obj_mach_o_process_stab(W,S,T,O,D) +extern void obj_mach_o_process_stab (int, const char *,int, int, int); + #endif /* _OBJ_MACH_O_H */ -- 2.30.2