diff options
author | nobody <> | 2009-01-03 17:43:47 +0000 |
---|---|---|
committer | nobody <> | 2009-01-03 17:43:47 +0000 |
commit | 98efba94c8d14ffea399e9a1859a6ced1e4869dc (patch) | |
tree | 03a93ec394427860fa23e131b4c834b417c614bf /bfd/elf32-ppc.c | |
parent | e7c73f57df961ee3db9b81f5dec5b3c5d9c3d288 (diff) | |
download | binutils-gdb-arc-20081103-branch.tar.gz |
This commit was manufactured by cvs2svn to create branchbinutils-arc-20081103-branchpointarc-20081103-branchpointarc-20081103-branch
'arc-20081103-branch'.
Sprout from binutils-2_19-branch 2008-09-08 08:56:58 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'binutils-'
Cherrypick from binutils-2_19-branch 2009-01-03 17:43:46 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'binutils-':
gas/testsuite/gas/ppc/common.d
gas/testsuite/gas/ppc/common.s
ld/testsuite/ld-powerpc/attr-gnu-12-1.s
ld/testsuite/ld-powerpc/attr-gnu-12-11.d
ld/testsuite/ld-powerpc/attr-gnu-12-2.s
ld/testsuite/ld-powerpc/attr-gnu-12-21.d
Cherrypick from binutils-2_19-branch 2008-09-11 09:06:56 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'binutils-':
gprof/po/ro.po
Cherrypick from binutils-2_19-branch 2008-09-26 07:02:45 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'binutils-':
gas/config/te-solaris.h
Cherrypick from master 2008-11-02 23:59:45 UTC Alan Modra <amodra@gmail.com> 'daily update':
ChangeLog
Makefile.def
Makefile.in
Makefile.tpl
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/aclocal.m4
bfd/bfd-in2.h
bfd/cache.c
bfd/coff64-rs6000.c
bfd/coffgen.c
bfd/cofflink.c
bfd/config.in
bfd/configure
bfd/configure.in
bfd/doc/Makefile.in
bfd/dwarf2.c
bfd/elf-bfd.h
bfd/elf-eh-frame.c
bfd/elf.c
bfd/elf32-cris.c
bfd/elf32-ppc.c
bfd/elf32-sh-symbian.c
bfd/elf32-spu.c
bfd/elf32-xtensa.c
bfd/elf64-ppc.c
bfd/elflink.c
bfd/elfxx-mips.c
bfd/libbfd.h
bfd/linker.c
bfd/po/id.po
bfd/po/vi.po
bfd/reloc.c
bfd/version.h
binutils/BRANCHES
binutils/ChangeLog
binutils/Makefile.in
binutils/aclocal.m4
binutils/config.in
binutils/configure
binutils/configure.in
binutils/dlltool.c
binutils/doc/Makefile.in
binutils/dwarf.c
binutils/embedspu.sh
binutils/objcopy.c
binutils/po/id.po
binutils/po/sv.po
binutils/readelf.c
binutils/stabs.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/group-2.s
binutils/testsuite/binutils-all/group-3.s
binutils/testsuite/binutils-all/group-4.s
binutils/testsuite/binutils-all/group.s
binutils/testsuite/binutils-all/objcopy.exp
binutils/testsuite/binutils-all/objdump.W
binutils/testsuite/binutils-all/strip-4.d
binutils/testsuite/binutils-all/strip-5.d
binutils/testsuite/binutils-all/strip-6.d
binutils/testsuite/binutils-all/strip-7.d
binutils/testsuite/binutils-all/strip-8.d
binutils/testsuite/binutils-all/strip-9.d
binutils/windmc.c
binutils/windres.c
configure
configure.ac
gas/ChangeLog
gas/Makefile.am
gas/Makefile.in
gas/NEWS
gas/aclocal.m4
gas/app.c
gas/config.in
gas/config/bfin-parse.y
gas/config/tc-bfin.c
gas/config/tc-cris.c
gas/config/tc-frv.c
gas/config/tc-frv.h
gas/config/tc-hppa.c
gas/config/tc-hppa.h
gas/config/tc-i386.c
gas/config/tc-i386.h
gas/config/tc-m68k.c
gas/config/tc-mips.c
gas/config/tc-mmix.c
gas/config/tc-mmix.h
gas/config/tc-mn10300.h
gas/config/tc-ns32k.c
gas/config/tc-ppc.c
gas/config/tc-sh.h
gas/config/tc-sh64.h
gas/config/tc-tic4x.c
gas/config/tc-xtensa.c
gas/config/tc-xtensa.h
gas/config/tc-z80.c
gas/configure
gas/configure.in
gas/configure.tgt
gas/doc/Makefile.in
gas/doc/as.texinfo
gas/doc/internals.texi
gas/dw2gencfi.c
gas/frags.c
gas/hash.c
gas/listing.c
gas/po/id.po
gas/read.c
gas/symbols.c
gas/testsuite/ChangeLog
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/cfi/cfi-alpha-1.d
gas/testsuite/gas/cfi/cfi-alpha-3.d
gas/testsuite/gas/cfi/cfi-arm-1.d
gas/testsuite/gas/cfi/cfi-common-1.d
gas/testsuite/gas/cfi/cfi-common-2.d
gas/testsuite/gas/cfi/cfi-common-3.d
gas/testsuite/gas/cfi/cfi-common-4.d
gas/testsuite/gas/cfi/cfi-common-5.d
gas/testsuite/gas/cfi/cfi-common-6.d
gas/testsuite/gas/cfi/cfi-hppa-1.d
gas/testsuite/gas/cfi/cfi-i386-2.d
gas/testsuite/gas/cfi/cfi-i386.d
gas/testsuite/gas/cfi/cfi-m68k.d
gas/testsuite/gas/cfi/cfi-mips-1.d
gas/testsuite/gas/cfi/cfi-ppc-1.d
gas/testsuite/gas/cfi/cfi-s390-1.d
gas/testsuite/gas/cfi/cfi-s390x-1.d
gas/testsuite/gas/cfi/cfi-sh-1.d
gas/testsuite/gas/cfi/cfi-sparc-1.d
gas/testsuite/gas/cfi/cfi-sparc64-1.d
gas/testsuite/gas/cfi/cfi-x86_64.d
gas/testsuite/gas/cris/rd-tls-1.d
gas/testsuite/gas/cris/rd-tls-1.s
gas/testsuite/gas/cris/rd-tls-2.d
gas/testsuite/gas/cris/rd-tls-2.s
gas/testsuite/gas/cris/tls-err-1.s
gas/testsuite/gas/cris/tls-err-2.s
gas/testsuite/gas/cris/tls-err-3.s
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/nops-5-i686.d
gas/testsuite/gas/i386/nops-5.d
gas/testsuite/gas/i386/nops-5.s
gas/testsuite/gas/i386/sse2avx.d
gas/testsuite/gas/i386/sse2avx.s
gas/testsuite/gas/i386/x86-64-nops-5-k8.d
gas/testsuite/gas/i386/x86-64-nops-5.d
gas/testsuite/gas/i386/x86-64-sse2avx.d
gas/testsuite/gas/i386/x86-64-sse2avx.s
gas/testsuite/gas/ppc/power4_32.d
gas/testsuite/gas/ppc/power4_32.s
gas/testsuite/gas/ppc/power6.d
gas/testsuite/gas/ppc/power6.s
gas/testsuite/gas/ppc/ppc.exp
gas/testsuite/gas/s390/esa-g5.d
gas/testsuite/gas/s390/esa-g5.s
gas/testsuite/gas/s390/esa-z990.d
gas/testsuite/gas/s390/esa-z990.s
gas/testsuite/gas/s390/zarch-z900.d
gas/testsuite/gas/s390/zarch-z900.s
gas/testsuite/gas/s390/zarch-z990.d
gas/testsuite/gas/s390/zarch-z990.s
gas/testsuite/gas/z80/arith.d
gas/testsuite/gas/z80/arith.s
gas/testsuite/gas/z80/bit.d
gas/testsuite/gas/z80/bit.s
gas/testsuite/gas/z80/block.d
gas/testsuite/gas/z80/block.s
gas/testsuite/gas/z80/branch.d
gas/testsuite/gas/z80/branch.s
gas/testsuite/gas/z80/inout.d
gas/testsuite/gas/z80/inout.s
gas/testsuite/gas/z80/ld-group.d
gas/testsuite/gas/z80/ld-group.s
gas/testsuite/gas/z80/misc.d
gas/testsuite/gas/z80/misc.s
gas/testsuite/gas/z80/rotate.d
gas/testsuite/gas/z80/rotate.s
gas/testsuite/gas/z80/z80.exp
gas/write.c
gold/ChangeLog
gold/Makefile.am
gold/Makefile.in
gold/archive.cc
gold/archive.h
gold/config.in
gold/configure
gold/configure.ac
gold/descriptors.cc
gold/descriptors.h
gold/fileread.cc
gold/fileread.h
gold/gold.cc
gold/i386.cc
gold/layout.cc
gold/main.cc
gold/mapfile.cc
gold/object.cc
gold/object.h
gold/options.cc
gold/options.h
gold/output.cc
gold/output.h
gold/plugin.cc
gold/plugin.h
gold/powerpc.cc
gold/readsyms.cc
gold/reloc.cc
gold/resolve.cc
gold/sparc.cc
gold/symtab.cc
gold/symtab.h
gold/target-reloc.h
gold/target.h
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/plugin_test.c
gold/testsuite/plugin_test_1.sh
gold/testsuite/plugin_test_2.sh
gold/testsuite/thin_archive_main.cc
gold/testsuite/thin_archive_test_1.cc
gold/testsuite/thin_archive_test_2.cc
gold/testsuite/thin_archive_test_3.cc
gold/testsuite/thin_archive_test_4.cc
gold/x86_64.cc
gprof/ChangeLog
gprof/Makefile.in
gprof/aclocal.m4
gprof/configure
gprof/configure.in
gprof/gconfig.in
gprof/po/vi.po
include/ChangeLog
include/demangle.h
include/elf/ChangeLog
include/elf/cris.h
include/elf/dwarf2.h
include/elf/ppc.h
include/obstack.h
include/plugin-api.h
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/aclocal.m4
ld/config.in
ld/configure
ld/configure.in
ld/emulparams/arcelf.sh
ld/emulparams/criself.sh
ld/emulparams/crislinux.sh
ld/emulparams/elf32_i860.sh
ld/emulparams/elf32_i960.sh
ld/emulparams/elf32_sparc.sh
ld/emulparams/elf32_spu.sh
ld/emulparams/elf32am33lin.sh
ld/emulparams/elf32fr30.sh
ld/emulparams/elf32ip2k.sh
ld/emulparams/elf32mcore.sh
ld/emulparams/elf32openrisc.sh
ld/emulparams/elf32ppccommon.sh
ld/emulparams/elf32ppcwindiss.sh
ld/emulparams/elf32vax.sh
ld/emulparams/elf64_s390.sh
ld/emulparams/elf64_sparc.sh
ld/emulparams/elf64alpha.sh
ld/emulparams/elf64mmix.sh
ld/emulparams/elf64ppc.sh
ld/emulparams/elf_i386.sh
ld/emulparams/elf_i386_be.sh
ld/emulparams/elf_i386_ldso.sh
ld/emulparams/elf_i386_vxworks.sh
ld/emulparams/elf_s390.sh
ld/emulparams/elf_x86_64.sh
ld/emulparams/h8300elf.sh
ld/emulparams/hppa64linux.sh
ld/emulparams/hppalinux.sh
ld/emulparams/i386lynx.sh
ld/emulparams/i386moss.sh
ld/emulparams/i386nto.sh
ld/emulparams/m68kelf.sh
ld/emulparams/mn10200.sh
ld/emulparams/or32elf.sh
ld/emulparams/pjelf.sh
ld/emulparams/ppclynx.sh
ld/emulparams/scoreelf.sh
ld/emulparams/shelf.sh
ld/emulparams/shelf32.sh
ld/emulparams/shelf_nto.sh
ld/emulparams/shelf_vxworks.sh
ld/emulparams/shlelf32_linux.sh
ld/emulparams/shlelf_linux.sh
ld/emulparams/shlelf_nto.sh
ld/emultempl/armelf.em
ld/emultempl/beos.em
ld/emultempl/elf32.em
ld/emultempl/genelf.em
ld/emultempl/mmo.em
ld/emultempl/pe.em
ld/emultempl/pep.em
ld/emultempl/spuelf.em
ld/emultempl/sunos.em
ld/ldemul.c
ld/ldemul.h
ld/ldexp.c
ld/ldlang.c
ld/ldlang.h
ld/pe-dll.c
ld/po/id.po
ld/po/vi.po
ld/scripttempl/avr.sc
ld/scripttempl/elf.sc
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/comm1.c
ld/testsuite/ld-elf/eh-frame-hdr.d
ld/testsuite/ld-elf/eh-group.exp
ld/testsuite/ld-elf/eh-group1.s
ld/testsuite/ld-elf/eh-group2.s
ld/testsuite/ld-elf/eh1.d
ld/testsuite/ld-elf/eh2.d
ld/testsuite/ld-elf/eh3.d
ld/testsuite/ld-elf/eh4.d
ld/testsuite/ld-elf/eh5.d
ld/testsuite/ld-elf/eh5b.s
ld/testsuite/ld-elf/eh6.d
ld/testsuite/ld-elf/extract-symbol-1sec.d
ld/testsuite/ld-elf/func1.c
ld/testsuite/ld-elf/group4.d
ld/testsuite/ld-elf/group5.d
ld/testsuite/ld-elf/group6.d
ld/testsuite/ld-elf/group7.d
ld/testsuite/ld-elf/shared.exp
ld/testsuite/ld-elf/stab.d
ld/testsuite/ld-elfcomm/common1b.c
ld/testsuite/ld-gc/gc.c
ld/testsuite/ld-ia64/tlsbin.rd
ld/testsuite/ld-ia64/tlspic.rd
ld/testsuite/ld-mips-elf/eh-frame1-n32.d
ld/testsuite/ld-mips-elf/eh-frame1-n64.d
ld/testsuite/ld-mips-elf/eh-frame2-n32.d
ld/testsuite/ld-mips-elf/eh-frame2-n64.d
ld/testsuite/ld-mips-elf/eh-frame3.d
ld/testsuite/ld-mips-elf/eh-frame4.d
ld/testsuite/ld-mips-elf/reloc-estimate-1.d
ld/testsuite/ld-powerpc/powerpc.exp
ld/testsuite/ld-powerpc/vxworks1-lib.rd
ld/testsuite/ld-shared/main.c
ld/testsuite/lib/ld-lib.exp
libiberty/ChangeLog
libiberty/Makefile.in
libiberty/config.in
libiberty/configure
libiberty/configure.ac
libiberty/cp-demangle.c
libiberty/cp-demangle.h
libiberty/testsuite/demangle-expected
libiberty/xstrdup.c
libtool.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4
opcodes/ChangeLog
opcodes/Makefile.am
opcodes/Makefile.in
opcodes/aclocal.m4
opcodes/configure
opcodes/configure.in
opcodes/i386-gen.c
opcodes/i386-opc.tbl
opcodes/i386-tbl.h
opcodes/po/fr.po
opcodes/po/vi.po
opcodes/s390-opc.c
opcodes/s390-opc.txt
opcodes/z80-dis.c
Diffstat (limited to 'bfd/elf32-ppc.c')
-rw-r--r-- | bfd/elf32-ppc.c | 191 |
1 files changed, 116 insertions, 75 deletions
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 84e72b8a041..83a927428a9 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -157,6 +157,12 @@ static const bfd_vma ppc_elf_vxworks_pic_plt0_entry /* Offset of tp and dtp pointers from start of TLS block. */ #define TP_OFFSET 0x7000 #define DTP_OFFSET 0x8000 + +/* The value of a defined global symbol. */ +#define SYM_VAL(SYM) \ + ((SYM)->root.u.def.section->output_section->vma \ + + (SYM)->root.u.def.section->output_offset \ + + (SYM)->root.u.def.value) static reloc_howto_type *ppc_elf_howto_table[R_PPC_max]; @@ -3958,6 +3964,33 @@ ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd) ibfd, obfd, in_abi, out_abi); } + /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes + and merge non-conflicting ones. */ + in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return]; + out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return]; + if (in_attr->i != out_attr->i) + { + out_attr->type = 1; + if (out_attr->i == 0) + out_attr->i = in_attr->i; + else if (in_attr->i == 0) + ; + else if (out_attr->i == 1 && in_attr->i == 2) + _bfd_error_handler + (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), obfd, ibfd); + else if (out_attr->i == 2 && in_attr->i == 1) + _bfd_error_handler + (_("Warning: %B uses r3/r4 for small structure returns, %B uses memory"), ibfd, obfd); + else if (in_attr->i > 2) + _bfd_error_handler + (_("Warning: %B uses unknown small structure return convention %d"), ibfd, + in_attr->i); + else + _bfd_error_handler + (_("Warning: %B uses unknown small structure return convention %d"), obfd, + out_attr->i); + } + /* Merge Tag_compatibility attributes and any common GNU ones. */ _bfd_elf_merge_object_attributes (ibfd, obfd); @@ -6656,8 +6689,10 @@ ppc_elf_relocate_section (bfd *output_bfd, } } - relocation = htab->got->output_offset + off; - relocation -= htab->elf.hgot->root.u.def.value; + relocation = (htab->got->output_section->vma + + htab->got->output_offset + + off + - SYM_VAL (htab->elf.hgot)); /* Addends on got relocations don't make much sense. x+off@got is actually x@got+off, and since the got is @@ -6971,12 +7006,15 @@ ppc_elf_relocate_section (bfd *output_bfd, an embedded ELF object, for which the .got section acts like the AIX .toc section. */ case R_PPC_TOC16: /* phony GOT16 relocations */ - BFD_ASSERT (sec != NULL); - BFD_ASSERT (bfd_is_und_section (sec) - || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0 + if (sec == NULL || sec->output_section == NULL) + { + unresolved_reloc = TRUE; + break; + } + BFD_ASSERT (strcmp (bfd_get_section_name (abfd, sec), ".got") == 0 || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0); - addend -= sec->output_section->vma + sec->output_offset + 0x8000; + addend -= sec->output_section->vma + sec->output_offset + 0x8000; break; case R_PPC_PLTREL24: @@ -7011,9 +7049,13 @@ ppc_elf_relocate_section (bfd *output_bfd, case R_PPC_SDAREL16: { const char *name; - struct elf_link_hash_entry *sh; - BFD_ASSERT (sec != NULL); + if (sec == NULL || sec->output_section == NULL) + { + unresolved_reloc = TRUE; + break; + } + name = bfd_get_section_name (abfd, sec->output_section); if (! ((CONST_STRNEQ (name, ".sdata") && (name[6] == 0 || name[6] == '.')) @@ -7028,10 +7070,7 @@ ppc_elf_relocate_section (bfd *output_bfd, howto->name, name); } - sh = htab->sdata[0].sym; - addend -= (sh->root.u.def.value - + sh->root.u.def.section->output_offset - + sh->root.u.def.section->output_section->vma); + addend -= SYM_VAL (htab->sdata[0].sym); } break; @@ -7039,9 +7078,13 @@ ppc_elf_relocate_section (bfd *output_bfd, case R_PPC_EMB_SDA2REL: { const char *name; - struct elf_link_hash_entry *sh; - BFD_ASSERT (sec != NULL); + if (sec == NULL || sec->output_section == NULL) + { + unresolved_reloc = TRUE; + break; + } + name = bfd_get_section_name (abfd, sec->output_section); if (! (CONST_STRNEQ (name, ".sdata2") || CONST_STRNEQ (name, ".sbss2"))) @@ -7058,10 +7101,7 @@ ppc_elf_relocate_section (bfd *output_bfd, ret = FALSE; continue; } - sh = htab->sdata[1].sym; - addend -= (sh->root.u.def.value - + sh->root.u.def.section->output_offset - + sh->root.u.def.section->output_section->vma); + addend -= SYM_VAL (htab->sdata[1].sym); } break; @@ -7071,9 +7111,13 @@ ppc_elf_relocate_section (bfd *output_bfd, { const char *name; int reg; - struct elf_link_hash_entry *sh; - BFD_ASSERT (sec != NULL); + if (sec == NULL || sec->output_section == NULL) + { + unresolved_reloc = TRUE; + break; + } + name = bfd_get_section_name (abfd, sec->output_section); if (((CONST_STRNEQ (name, ".sdata") && (name[6] == 0 || name[6] == '.')) @@ -7081,28 +7125,19 @@ ppc_elf_relocate_section (bfd *output_bfd, && (name[5] == 0 || name[5] == '.')))) { reg = 13; - sh = htab->sdata[0].sym; - addend -= (sh->root.u.def.value - + sh->root.u.def.section->output_offset - + sh->root.u.def.section->output_section->vma); + addend -= SYM_VAL (htab->sdata[0].sym); } - else if (CONST_STRNEQ (name, ".sdata2") || CONST_STRNEQ (name, ".sbss2")) { reg = 2; - sh = htab->sdata[1].sym; - addend -= (sh->root.u.def.value - + sh->root.u.def.section->output_offset - + sh->root.u.def.section->output_section->vma); + addend -= SYM_VAL (htab->sdata[1].sym); } - else if (strcmp (name, ".PPC.EMB.sdata0") == 0 || strcmp (name, ".PPC.EMB.sbss0") == 0) { reg = 0; } - else { (*_bfd_error_handler) @@ -7132,7 +7167,11 @@ ppc_elf_relocate_section (bfd *output_bfd, case R_PPC_SECTOFF_LO: case R_PPC_SECTOFF_HI: case R_PPC_SECTOFF_HA: - BFD_ASSERT (sec != NULL); + if (sec == NULL || sec->output_section == NULL) + { + unresolved_reloc = TRUE; + break; + } addend -= sec->output_section->vma; break; @@ -7347,31 +7386,22 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd, /* Fill in the .plt on VxWorks. */ if (info->shared) { - bfd_vma got_offset_hi = (got_offset >> 16) - + ((got_offset & 0x8000) >> 15); - bfd_put_32 (output_bfd, - plt_entry[0] | (got_offset_hi & 0xffff), + plt_entry[0] | PPC_HA (got_offset), htab->plt->contents + ent->plt.offset + 0); bfd_put_32 (output_bfd, - plt_entry[1] | (got_offset & 0xffff), + plt_entry[1] | PPC_LO (got_offset), htab->plt->contents + ent->plt.offset + 4); } else { - bfd_vma got_loc - = (got_offset - + htab->elf.hgot->root.u.def.value - + htab->elf.hgot->root.u.def.section->output_offset - + htab->elf.hgot->root.u.def.section->output_section->vma); - bfd_vma got_loc_hi = (got_loc >> 16) - + ((got_loc & 0x8000) >> 15); + bfd_vma got_loc = got_offset + SYM_VAL (htab->elf.hgot); bfd_put_32 (output_bfd, - plt_entry[0] | (got_loc_hi & 0xffff), + plt_entry[0] | PPC_HA (got_loc), htab->plt->contents + ent->plt.offset + 0); bfd_put_32 (output_bfd, - plt_entry[1] | (got_loc & 0xffff), + plt_entry[1] | PPC_LO (got_loc), htab->plt->contents + ent->plt.offset + 4); } @@ -7531,9 +7561,7 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd, + ent->sec->output_section->vma + ent->sec->output_offset); else if (htab->elf.hgot != NULL) - got = (htab->elf.hgot->root.u.def.value - + htab->elf.hgot->root.u.def.section->output_section->vma - + htab->elf.hgot->root.u.def.section->output_offset); + got = SYM_VAL (htab->elf.hgot); plt -= got; @@ -7599,9 +7627,7 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd, s = htab->relbss; BFD_ASSERT (s != NULL); - rela.r_offset = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); + rela.r_offset = SYM_VAL (h); rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY); rela.r_addend = 0; loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); @@ -7651,7 +7677,8 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, asection *splt; struct ppc_elf_link_hash_table *htab; bfd_vma got; - bfd * dynobj; + bfd *dynobj; + bfd_boolean ret = TRUE; #ifdef DEBUG fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n"); @@ -7667,9 +7694,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, got = 0; if (htab->elf.hgot != NULL) - got = (htab->elf.hgot->root.u.def.value - + htab->elf.hgot->root.u.def.section->output_section->vma - + htab->elf.hgot->root.u.def.section->output_offset); + got = SYM_VAL (htab->elf.hgot); if (htab->elf.dynamic_sections_created) { @@ -7729,21 +7754,41 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, } } - /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can - easily find the address of the _GLOBAL_OFFSET_TABLE_. */ if (htab->got != NULL) { - unsigned char *p = htab->got->contents; - bfd_vma val; + if (htab->elf.hgot->root.u.def.section == htab->got + || htab->elf.hgot->root.u.def.section == htab->sgotplt) + { + unsigned char *p = htab->elf.hgot->root.u.def.section->contents; - p += htab->elf.hgot->root.u.def.value; - if (htab->plt_type == PLT_OLD) - bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4); + p += htab->elf.hgot->root.u.def.value; + if (htab->plt_type == PLT_OLD) + { + /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 + so that a function can easily find the address of + _GLOBAL_OFFSET_TABLE_. */ + BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4 + < htab->elf.hgot->root.u.def.section->size); + bfd_put_32 (output_bfd, 0x4e800021, p - 4); + } - val = 0; - if (sdyn != NULL) - val = sdyn->output_section->vma + sdyn->output_offset; - bfd_put_32 (output_bfd, val, p); + if (sdyn != NULL) + { + bfd_vma val = sdyn->output_section->vma + sdyn->output_offset; + BFD_ASSERT (htab->elf.hgot->root.u.def.value + < htab->elf.hgot->root.u.def.section->size); + bfd_put_32 (output_bfd, val, p); + } + } + else + { + (*_bfd_error_handler) (_("%s not defined in linker created %s"), + htab->elf.hgot->root.root.string, + (htab->sgotplt != NULL + ? htab->sgotplt->name : htab->got->name)); + bfd_set_error (bfd_error_bad_value); + ret = FALSE; + } elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4; } @@ -7758,15 +7803,11 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, if (!info->shared) { - bfd_vma got_value = - (htab->elf.hgot->root.u.def.section->output_section->vma - + htab->elf.hgot->root.u.def.section->output_offset - + htab->elf.hgot->root.u.def.value); - bfd_vma got_hi = (got_value >> 16) + ((got_value & 0x8000) >> 15); + bfd_vma got_value = SYM_VAL (htab->elf.hgot); - bfd_put_32 (output_bfd, plt_entry[0] | (got_hi & 0xffff), + bfd_put_32 (output_bfd, plt_entry[0] | PPC_HA (got_value), splt->contents + 0); - bfd_put_32 (output_bfd, plt_entry[1] | (got_value & 0xffff), + bfd_put_32 (output_bfd, plt_entry[1] | PPC_LO (got_value), splt->contents + 4); } else @@ -8031,7 +8072,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd, } } - return TRUE; + return ret; } #define TARGET_LITTLE_SYM bfd_elf32_powerpcle_vec |