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.
This commit is contained in:
Iain Sandoe 2012-01-13 12:59:30 +00:00
parent bb76d9401e
commit 687be931eb
7 changed files with 73 additions and 4 deletions

View File

@ -1,6 +1,11 @@
2012-01-13 Iain Sandoe <idsandoe@googlemail.com>
* 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 <idsandoe@googlemail.com>
* 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 <idsandoe@googlemail.com>

View File

@ -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;
}

View File

@ -1,3 +1,8 @@
2012-01-13 Iain Sandoe <idsandoe@googlemail.com>
* config/obj-macho.c (obj_mach_o_set_indirect_symbols): Handle
absolute indirect symbols.
2012-01-13 Iain Sandoe <idsandoe@googlemail.com>
* config/obj-macho.c (obj_mach_o_set_vma_data): New type.

View File

@ -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 ... */

View File

@ -1,3 +1,8 @@
2012-01-13 Iain Sandoe <idsandoe@googlemail.com>
* gas/mach-o/dysymtab-3.d: New.
* gas/mach-o/symbols-7.s: New.
2012-01-13 Iain Sandoe <idsandoe@googlemail.com>
* gas/mach-o/dysymtab-2.d: Update to include the set VMA.

View File

@ -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

View File

@ -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