[Patch mach-o/gas 1/2] support stabs
Iain Sandoe
developer@sandoe-acoustics.co.uk
Sat Dec 31 13:26:00 GMT 2011
-gstabs is still a valid flag for GCC on Darwin (although it probably
is almost irrelevant for 64bit and newer systems). Nevertheless we
need to support it for now.
... just for once the patches to add it are quite small ;-)
Patch 1 applies independently, patch 2 applies on top of symbol
handling patches.
OK?
Iain
bfd:
* mach-o.c (bfd_mach_o_mangle_symbols): Put in the section index
for stabd symbols.
gas:
* config/obj-macho.c (obj_macho_process_stab): New.
* config/obj-macho.h (OBJ_PROCESS_STAB, obj_macho_process_stab):
Define.
bfd/mach-o.c | 6 ++++--
gas/config/obj-macho.c | 40 ++++++++++++++++++++++++++++++++++++++++
gas/config/obj-macho.h | 3 +++
gas/stabs.c | 3 +++
4 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index cc68d89..920340e 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -1456,10 +1456,12 @@ bfd_mach_o_mangle_symbols (bfd *abfd)
}
/* Compute section index. */
- 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;
/* Number symbols. */
s->symbol.udata.i = i;
diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
index 74fb0c9..db2146a 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -850,3 +850,43 @@ const pseudo_typeS mach_o_pseudo_table[] =
{NULL, NULL, 0}
};
+
+/* Support stabs for mach-o. */
+
+void
+obj_macho_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;
+
+ /* ... and that 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 d9b0b33..3678259 100644
--- a/gas/config/obj-macho.h
+++ b/gas/config/obj-macho.h
@@ -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_macho_process_stab(W,S,T,O,D)
+extern void obj_macho_process_stab (int, const char *,int, int, int);
+
#endif /* _OBJ_MACH_O_H */
More information about the Binutils
mailing list