From: Iain Sandoe Date: Fri, 13 Jan 2012 12:59:30 +0000 (+0000) Subject: handle absolute indirect syms in mach-o X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=687be931eb3d3064e1ae6026f0c415048d9914cf;p=binutils-gdb.git handle absolute indirect syms in mach-o bfd: * mach-o.c (bfd_mach_o_build_dysymtab_command): Handle absolute indirect symbols. gas: * config/obj-macho.c (obj_mach_o_set_indirect_symbols): Handle absolute indirect symbols. gas/testsuite: * gas/mach-o/dysymtab-3.d: New. * gas/mach-o/symbols-7.s: New. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 77749a7833b..7b569678ec2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,11 @@ 2012-01-13 Iain Sandoe - * mach-o.c (bfd_mach_o_write_relocs): Move compuation of relocs file + * mach-o.c (bfd_mach_o_build_dysymtab_command): Handle absolute + indirect symbols. + +2012-01-13 Iain Sandoe + + * mach-o.c (bfd_mach_o_write_relocs): Move computation of relocs file position from here... to (bfd_mach_o_build_seg_command): Here. 2012-01-12 Iain Sandoe diff --git a/bfd/mach-o.c b/bfd/mach-o.c index 262531970f5..a13ac4ea69d 100644 --- a/bfd/mach-o.c +++ b/bfd/mach-o.c @@ -2210,6 +2210,10 @@ bfd_mach_o_build_dysymtab_command (bfd *abfd, { if (isyms[j] == NULL) dsym->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL; + else if (isyms[j]->symbol.section == bfd_abs_section_ptr + && ! (isyms[j]->n_type & BFD_MACH_O_N_EXT)) + dsym->indirect_syms[n] = BFD_MACH_O_INDIRECT_SYM_LOCAL + | BFD_MACH_O_INDIRECT_SYM_ABS; else dsym->indirect_syms[n] = isyms[j]->symbol.udata.i; } diff --git a/gas/ChangeLog b/gas/ChangeLog index befc7bfd135..9d405565a7f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2012-01-13 Iain Sandoe + + * config/obj-macho.c (obj_mach_o_set_indirect_symbols): Handle + absolute indirect symbols. + 2012-01-13 Iain Sandoe * config/obj-macho.c (obj_mach_o_set_vma_data): New type. diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index 988b098a1b7..ddf098881b5 100644 --- a/gas/config/obj-macho.c +++ b/gas/config/obj-macho.c @@ -1630,14 +1630,18 @@ obj_mach_o_set_indirect_symbols (bfd *abfd, asection *sec, for (isym = list, n = 0; isym != NULL; isym = isym->next, n++) { + sym = (bfd_mach_o_asymbol *)symbol_get_bfdsym (isym->sym); /* Array is init to NULL & NULL signals a local symbol If the section is lazy-bound, we need to keep the - reference to the symbol, since dyld can override. */ - if (S_IS_LOCAL (isym->sym) && ! lazy) + reference to the symbol, since dyld can override. + + Absolute symbols are handled specially. */ + if (sym->symbol.section == bfd_abs_section_ptr) + ms->indirect_syms[n] = sym; + else if (S_IS_LOCAL (isym->sym) && ! lazy) ; else { - sym = (bfd_mach_o_asymbol *)symbol_get_bfdsym (isym->sym); if (sym == NULL) ; /* If the symbols is external ... */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index cb0c64df449..01418cb3f14 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-01-13 Iain Sandoe + + * gas/mach-o/dysymtab-3.d: New. + * gas/mach-o/symbols-7.s: New. + 2012-01-13 Iain Sandoe * gas/mach-o/dysymtab-2.d: Update to include the set VMA. diff --git a/gas/testsuite/gas/mach-o/dysymtab-3.d b/gas/testsuite/gas/mach-o/dysymtab-3.d new file mode 100644 index 00000000000..6d2430f9e4e --- /dev/null +++ b/gas/testsuite/gas/mach-o/dysymtab-3.d @@ -0,0 +1,22 @@ +#as: -L +#objdump: -P dysymtab +#target: i?86-*-darwin* powerpc-*-darwin* +#source: symbols-7.s +.*: +file format mach-o.* +#... +Load command dysymtab: +( )+local symbols: idx:( )+0 num: 4( )+\(nxtidx: 4\) +( )+external symbols: idx:( )+4 num: 1( )+\(nxtidx: 5\) +( )+undefined symbols: idx:( )+5 num: 0( )+\(nxtidx: 5\) +( )+table of content: off: 0x00000000 num: 0( )+\(endoff: 0x00000000\) +( )+module table: off: 0x00000000 num: 0( )+\(endoff: 0x00000000\) +( )+external reference table: off: 0x00000000 num: 0( )+\(endoff: 0x00000000\) +( )+indirect symbol table: off: 0x00000170 num: 4( )+\(endoff: 0x00000180\) +( )+external relocation table: off: 0x00000000 num: 0( )+\(endoff: 0x00000000\) +( )+local relocation table: off: 0x00000000 num: 0( )+\(endoff: 0x00000000\) +( )+indirect symbols: +( )+for section __DATA.__nl_symbol_ptr: +( )+0000000000000014( )+0: 0xc0000000 LOCAL ABSOLUTE +( )+0000000000000018( )+1: 0x80000000 LOCAL +( )+000000000000001c( )+2: 0xc0000000 LOCAL ABSOLUTE +( )+0000000000000020( )+3: 0x00000004 c diff --git a/gas/testsuite/gas/mach-o/symbols-7.s b/gas/testsuite/gas/mach-o/symbols-7.s new file mode 100644 index 00000000000..8df048de09b --- /dev/null +++ b/gas/testsuite/gas/mach-o/symbols-7.s @@ -0,0 +1,24 @@ + +L01: .space 10 + +L02: .space 10 + + + .non_lazy_symbol_pointer + + a = 5 + .indirect_symbol a + .space 4 + + .indirect_symbol L01 + .long L01-. + + .indirect_symbol b + .space 4 + + b = 10 + + .globl c + c = 20 + .indirect_symbol c + .space 4