You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
674 lines
25 KiB
674 lines
25 KiB
6 years ago
|
commit f9c6b9078c54ea0f018b673e2ff128e61a0aa666
|
||
|
Author: Alan Modra <amodra@gmail.com>
|
||
|
Date: Tue Oct 29 16:53:25 2013 +1030
|
||
|
|
||
|
Report overflow on PowerPC64 @h and @ha relocations.
|
||
|
|
||
|
This changes the behaviour of @h and @ha on PowerPC64 to report errors
|
||
|
on 32-bit overflow. The motivation for this change is that on
|
||
|
PowerPC64, most uses of @h and @ha modifiers and their corresponding
|
||
|
relocations are to build up 32-bit offsets. We'd like to know when
|
||
|
such offsets overflow. Only rarely do people use @h or @ha with the
|
||
|
high 32-bit modifiers to build a 64-bit constant. Those uses will now
|
||
|
need to use two new modifiers, @high and @higha, if the constant isn't
|
||
|
known at assembly time. For now, we won't report overflow at assembly
|
||
|
time..
|
||
|
|
||
|
This also fixes an error when applying some of the HIGHER and HIGHEST
|
||
|
relocations.
|
||
|
|
||
|
include/elf/
|
||
|
* ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
|
||
|
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
|
||
|
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New.
|
||
|
(IS_PPC64_TLS_RELOC): Match new tls relocs.
|
||
|
bfd/
|
||
|
* reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
|
||
|
BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
|
||
|
BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
|
||
|
* elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
|
||
|
Make all _HA and _HI relocs report signed overflow.
|
||
|
(ppc64_elf_reloc_type_lookup): Handle new relocs.
|
||
|
(must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
|
||
|
(dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
|
||
|
(ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
|
||
|
R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
|
||
|
R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
|
||
|
* libbfd.h: Regenerate.
|
||
|
* bfd-in2.h: Regenerate.
|
||
|
gas/
|
||
|
* config/tc-ppc.c (SEX16): Don't mask.
|
||
|
(REPORT_OVERFLOW_HI): Define as zero.
|
||
|
(ppc_elf_suffix): Support @high, @higha, @dtprel@high, @dtprel@higha,
|
||
|
@tprel@high, and @tprel@higha modifiers.
|
||
|
(md_assemble): Ignore X_unsigned when applying 16-bit insn fields.
|
||
|
Add (disabled) code to check @h and @ha reloc overflow for powerpc64.
|
||
|
Handle new relocs.
|
||
|
(md_apply_fix): Similarly.
|
||
|
elfcpp/
|
||
|
* powerpc.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
|
||
|
R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
|
||
|
R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): Define.
|
||
|
gold/
|
||
|
* powerpc.cc (Target_powerpc::Scan::check_non_pic): Handle new relocs.
|
||
|
(Target_powerpc::Scan::global, local): Likewise.
|
||
|
(Target_powerpc::Relocate::relocate): Likewise. Check for overflow
|
||
|
on all ppc64 @h and @ha relocs.
|
||
|
|
||
|
### a/bfd/ChangeLog
|
||
|
### b/bfd/ChangeLog
|
||
|
## -1,3 +1,19 @@
|
||
|
+2013-10-30 Alan Modra <amodra@gmail.com>
|
||
|
+
|
||
|
+ * reloc.c (BFD_RELOC_PPC64_ADDR16_HIGH, BFD_RELOC_PPC64_ADDR16_HIGHA,
|
||
|
+ BFD_RELOC_PPC64_TPREL16_HIGH, BFD_RELOC_PPC64_TPREL16_HIGHA,
|
||
|
+ BFD_RELOC_PPC64_DTPREL16_HIGH, BFD_RELOC_PPC64_DTPREL16_HIGHA): New.
|
||
|
+ * elf64-ppc.c (ppc64_elf_howto_raw): Add entries for new relocs.
|
||
|
+ Make all _HA and _HI relocs report signed overflow.
|
||
|
+ (ppc64_elf_reloc_type_lookup): Handle new relocs.
|
||
|
+ (must_be_dyn_reloc, ppc64_elf_check_relocs): Likewise.
|
||
|
+ (dec_dynrel_count, ppc64_elf_relocate_section): Likewise.
|
||
|
+ (ppc64_elf_relocate_section): Don't apply 0x8000 adjust to
|
||
|
+ R_PPC64_TPREL16_HIGHER, R_PPC64_TPREL16_HIGHEST,
|
||
|
+ R_PPC64_DTPREL16_HIGHER, and R_PPC64_DTPREL16_HIGHEST.
|
||
|
+ * libbfd.h: Regenerate.
|
||
|
+ * bfd-in2.h: Regenerate.
|
||
|
+
|
||
|
2013-10-29 Roland McGrath <mcgrathr@google.com>
|
||
|
|
||
|
* elf64-x86-64.c (elf_x86_64_nacl_plt0_entry): Correct 9-byte nop
|
||
|
--- a/bfd/bfd-in2.h
|
||
|
+++ b/bfd/bfd-in2.h
|
||
|
@@ -3223,6 +3223,8 @@ instruction. */
|
||
|
BFD_RELOC_PPC64_TOC16_LO_DS,
|
||
|
BFD_RELOC_PPC64_PLTGOT16_DS,
|
||
|
BFD_RELOC_PPC64_PLTGOT16_LO_DS,
|
||
|
+ BFD_RELOC_PPC64_ADDR16_HIGH,
|
||
|
+ BFD_RELOC_PPC64_ADDR16_HIGHA,
|
||
|
|
||
|
/* PowerPC and PowerPC64 thread-local storage relocations. */
|
||
|
BFD_RELOC_PPC_TLS,
|
||
|
@@ -3267,6 +3269,10 @@ instruction. */
|
||
|
BFD_RELOC_PPC64_DTPREL16_HIGHERA,
|
||
|
BFD_RELOC_PPC64_DTPREL16_HIGHEST,
|
||
|
BFD_RELOC_PPC64_DTPREL16_HIGHESTA,
|
||
|
+ BFD_RELOC_PPC64_TPREL16_HIGH,
|
||
|
+ BFD_RELOC_PPC64_TPREL16_HIGHA,
|
||
|
+ BFD_RELOC_PPC64_DTPREL16_HIGH,
|
||
|
+ BFD_RELOC_PPC64_DTPREL16_HIGHA,
|
||
|
|
||
|
/* IBM 370/390 relocations */
|
||
|
BFD_RELOC_I370_D12,
|
||
|
--- a/bfd/elf64-ppc.c
|
||
|
+++ b/bfd/elf64-ppc.c
|
||
|
@@ -309,7 +309,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
bfd_elf_generic_reloc, /* special_function */
|
||
|
"R_PPC64_ADDR16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -325,7 +325,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_ha_reloc, /* special_function */
|
||
|
"R_PPC64_ADDR16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -487,7 +487,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont,/* complain_on_overflow */
|
||
|
+ complain_overflow_signed,/* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -503,7 +503,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont,/* complain_on_overflow */
|
||
|
+ complain_overflow_signed,/* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -680,7 +680,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_PLT16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -696,7 +696,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_PLT16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -741,7 +741,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_sectoff_reloc, /* special_function */
|
||
|
"R_PPC64_SECTOFF_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -756,7 +756,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_sectoff_ha_reloc, /* special_function */
|
||
|
"R_PPC64_SECTOFF_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -963,7 +963,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_toc_reloc, /* special_function */
|
||
|
"R_PPC64_TOC16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -982,7 +982,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_toc_ha_reloc, /* special_function */
|
||
|
"R_PPC64_TOC16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1054,7 +1054,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_PLTGOT16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1072,7 +1072,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont,/* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_PLTGOT16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1374,7 +1374,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_DTPREL16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1389,7 +1389,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_DTPREL16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1540,7 +1540,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_TPREL16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1555,7 +1555,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_TPREL16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1692,7 +1692,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_TLSGD16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1707,7 +1707,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_TLSGD16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1754,7 +1754,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_TLSLD16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1769,7 +1769,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_TLSLD16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1815,7 +1815,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_DTPREL16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1830,7 +1830,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_DTPREL16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1876,7 +1876,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_TPREL16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1891,7 +1891,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
FALSE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
"R_PPC64_GOT_TPREL16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1964,7 +1964,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
TRUE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
bfd_elf_generic_reloc, /* special_function */
|
||
|
"R_PPC64_REL16_HI", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1980,7 +1980,7 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
16, /* bitsize */
|
||
|
TRUE, /* pc_relative */
|
||
|
0, /* bitpos */
|
||
|
- complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ complain_overflow_signed, /* complain_on_overflow */
|
||
|
ppc64_elf_ha_reloc, /* special_function */
|
||
|
"R_PPC64_REL16_HA", /* name */
|
||
|
FALSE, /* partial_inplace */
|
||
|
@@ -1988,6 +1988,96 @@ static reloc_howto_type ppc64_elf_howto_raw[] = {
|
||
|
0xffff, /* dst_mask */
|
||
|
TRUE), /* pcrel_offset */
|
||
|
|
||
|
+ /* Like R_PPC64_ADDR16_HI, but no overflow. */
|
||
|
+ HOWTO (R_PPC64_ADDR16_HIGH, /* type */
|
||
|
+ 16, /* rightshift */
|
||
|
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
|
||
|
+ 16, /* bitsize */
|
||
|
+ FALSE, /* pc_relative */
|
||
|
+ 0, /* bitpos */
|
||
|
+ complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ bfd_elf_generic_reloc, /* special_function */
|
||
|
+ "R_PPC64_ADDR16_HIGH", /* name */
|
||
|
+ FALSE, /* partial_inplace */
|
||
|
+ 0, /* src_mask */
|
||
|
+ 0xffff, /* dst_mask */
|
||
|
+ FALSE), /* pcrel_offset */
|
||
|
+
|
||
|
+ /* Like R_PPC64_ADDR16_HA, but no overflow. */
|
||
|
+ HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
|
||
|
+ 16, /* rightshift */
|
||
|
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
|
||
|
+ 16, /* bitsize */
|
||
|
+ FALSE, /* pc_relative */
|
||
|
+ 0, /* bitpos */
|
||
|
+ complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ ppc64_elf_ha_reloc, /* special_function */
|
||
|
+ "R_PPC64_ADDR16_HIGHA", /* name */
|
||
|
+ FALSE, /* partial_inplace */
|
||
|
+ 0, /* src_mask */
|
||
|
+ 0xffff, /* dst_mask */
|
||
|
+ FALSE), /* pcrel_offset */
|
||
|
+
|
||
|
+ /* Like R_PPC64_DTPREL16_HI, but no overflow. */
|
||
|
+ HOWTO (R_PPC64_DTPREL16_HIGH,
|
||
|
+ 16, /* rightshift */
|
||
|
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
|
||
|
+ 16, /* bitsize */
|
||
|
+ FALSE, /* pc_relative */
|
||
|
+ 0, /* bitpos */
|
||
|
+ complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
+ "R_PPC64_DTPREL16_HIGH", /* name */
|
||
|
+ FALSE, /* partial_inplace */
|
||
|
+ 0, /* src_mask */
|
||
|
+ 0xffff, /* dst_mask */
|
||
|
+ FALSE), /* pcrel_offset */
|
||
|
+
|
||
|
+ /* Like R_PPC64_DTPREL16_HA, but no overflow. */
|
||
|
+ HOWTO (R_PPC64_DTPREL16_HIGHA,
|
||
|
+ 16, /* rightshift */
|
||
|
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
|
||
|
+ 16, /* bitsize */
|
||
|
+ FALSE, /* pc_relative */
|
||
|
+ 0, /* bitpos */
|
||
|
+ complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
+ "R_PPC64_DTPREL16_HIGHA", /* name */
|
||
|
+ FALSE, /* partial_inplace */
|
||
|
+ 0, /* src_mask */
|
||
|
+ 0xffff, /* dst_mask */
|
||
|
+ FALSE), /* pcrel_offset */
|
||
|
+
|
||
|
+ /* Like R_PPC64_TPREL16_HI, but no overflow. */
|
||
|
+ HOWTO (R_PPC64_TPREL16_HIGH,
|
||
|
+ 16, /* rightshift */
|
||
|
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
|
||
|
+ 16, /* bitsize */
|
||
|
+ FALSE, /* pc_relative */
|
||
|
+ 0, /* bitpos */
|
||
|
+ complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
+ "R_PPC64_TPREL16_HIGH", /* name */
|
||
|
+ FALSE, /* partial_inplace */
|
||
|
+ 0, /* src_mask */
|
||
|
+ 0xffff, /* dst_mask */
|
||
|
+ FALSE), /* pcrel_offset */
|
||
|
+
|
||
|
+ /* Like R_PPC64_TPREL16_HA, but no overflow. */
|
||
|
+ HOWTO (R_PPC64_TPREL16_HIGHA,
|
||
|
+ 16, /* rightshift */
|
||
|
+ 1, /* size (0 = byte, 1 = short, 2 = long) */
|
||
|
+ 16, /* bitsize */
|
||
|
+ FALSE, /* pc_relative */
|
||
|
+ 0, /* bitpos */
|
||
|
+ complain_overflow_dont, /* complain_on_overflow */
|
||
|
+ ppc64_elf_unhandled_reloc, /* special_function */
|
||
|
+ "R_PPC64_TPREL16_HIGHA", /* name */
|
||
|
+ FALSE, /* partial_inplace */
|
||
|
+ 0, /* src_mask */
|
||
|
+ 0xffff, /* dst_mask */
|
||
|
+ FALSE), /* pcrel_offset */
|
||
|
+
|
||
|
/* GNU extension to record C++ vtable hierarchy. */
|
||
|
HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
|
||
|
0, /* rightshift */
|
||
|
@@ -2066,8 +2156,12 @@ ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
||
|
break;
|
||
|
case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
|
||
|
break;
|
||
|
+ case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
|
||
|
+ break;
|
||
|
case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
|
||
|
break;
|
||
|
+ case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
|
||
|
+ break;
|
||
|
case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
|
||
|
break;
|
||
|
case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
|
||
|
@@ -2186,8 +2280,12 @@ ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
||
|
break;
|
||
|
case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
|
||
|
break;
|
||
|
+ case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
|
||
|
+ break;
|
||
|
case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
|
||
|
break;
|
||
|
+ case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
|
||
|
+ break;
|
||
|
case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
|
||
|
break;
|
||
|
case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
|
||
|
@@ -2196,8 +2294,12 @@ ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
||
|
break;
|
||
|
case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
|
||
|
break;
|
||
|
+ case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
|
||
|
+ break;
|
||
|
case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
|
||
|
break;
|
||
|
+ case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
|
||
|
+ break;
|
||
|
case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
|
||
|
break;
|
||
|
case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
|
||
|
@@ -3514,6 +3616,8 @@ must_be_dyn_reloc (struct bfd_link_info *info,
|
||
|
case R_PPC64_TPREL16_HA:
|
||
|
case R_PPC64_TPREL16_DS:
|
||
|
case R_PPC64_TPREL16_LO_DS:
|
||
|
+ case R_PPC64_TPREL16_HIGH:
|
||
|
+ case R_PPC64_TPREL16_HIGHA:
|
||
|
case R_PPC64_TPREL16_HIGHER:
|
||
|
case R_PPC64_TPREL16_HIGHERA:
|
||
|
case R_PPC64_TPREL16_HIGHEST:
|
||
|
@@ -5208,6 +5312,8 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||
|
case R_PPC64_DTPREL16_HA:
|
||
|
case R_PPC64_DTPREL16_DS:
|
||
|
case R_PPC64_DTPREL16_LO_DS:
|
||
|
+ case R_PPC64_DTPREL16_HIGH:
|
||
|
+ case R_PPC64_DTPREL16_HIGHA:
|
||
|
case R_PPC64_DTPREL16_HIGHER:
|
||
|
case R_PPC64_DTPREL16_HIGHERA:
|
||
|
case R_PPC64_DTPREL16_HIGHEST:
|
||
|
@@ -5368,6 +5474,8 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||
|
case R_PPC64_TPREL16_HA:
|
||
|
case R_PPC64_TPREL16_DS:
|
||
|
case R_PPC64_TPREL16_LO_DS:
|
||
|
+ case R_PPC64_TPREL16_HIGH:
|
||
|
+ case R_PPC64_TPREL16_HIGHA:
|
||
|
case R_PPC64_TPREL16_HIGHER:
|
||
|
case R_PPC64_TPREL16_HIGHERA:
|
||
|
case R_PPC64_TPREL16_HIGHEST:
|
||
|
@@ -5421,6 +5529,8 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||
|
case R_PPC64_ADDR16_DS:
|
||
|
case R_PPC64_ADDR16_HA:
|
||
|
case R_PPC64_ADDR16_HI:
|
||
|
+ case R_PPC64_ADDR16_HIGH:
|
||
|
+ case R_PPC64_ADDR16_HIGHA:
|
||
|
case R_PPC64_ADDR16_HIGHER:
|
||
|
case R_PPC64_ADDR16_HIGHERA:
|
||
|
case R_PPC64_ADDR16_HIGHEST:
|
||
|
@@ -7052,6 +7162,8 @@ dec_dynrel_count (bfd_vma r_info,
|
||
|
case R_PPC64_TPREL16_HA:
|
||
|
case R_PPC64_TPREL16_DS:
|
||
|
case R_PPC64_TPREL16_LO_DS:
|
||
|
+ case R_PPC64_TPREL16_HIGH:
|
||
|
+ case R_PPC64_TPREL16_HIGHA:
|
||
|
case R_PPC64_TPREL16_HIGHER:
|
||
|
case R_PPC64_TPREL16_HIGHERA:
|
||
|
case R_PPC64_TPREL16_HIGHEST:
|
||
|
@@ -7073,6 +7185,8 @@ dec_dynrel_count (bfd_vma r_info,
|
||
|
case R_PPC64_ADDR16_DS:
|
||
|
case R_PPC64_ADDR16_HA:
|
||
|
case R_PPC64_ADDR16_HI:
|
||
|
+ case R_PPC64_ADDR16_HIGH:
|
||
|
+ case R_PPC64_ADDR16_HIGHA:
|
||
|
case R_PPC64_ADDR16_HIGHER:
|
||
|
case R_PPC64_ADDR16_HIGHERA:
|
||
|
case R_PPC64_ADDR16_HIGHEST:
|
||
|
@@ -13531,6 +13645,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||
|
case R_PPC64_TPREL16_HA:
|
||
|
case R_PPC64_TPREL16_DS:
|
||
|
case R_PPC64_TPREL16_LO_DS:
|
||
|
+ case R_PPC64_TPREL16_HIGH:
|
||
|
+ case R_PPC64_TPREL16_HIGHA:
|
||
|
case R_PPC64_TPREL16_HIGHER:
|
||
|
case R_PPC64_TPREL16_HIGHERA:
|
||
|
case R_PPC64_TPREL16_HIGHEST:
|
||
|
@@ -13565,6 +13681,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||
|
case R_PPC64_DTPREL16_HA:
|
||
|
case R_PPC64_DTPREL16_DS:
|
||
|
case R_PPC64_DTPREL16_LO_DS:
|
||
|
+ case R_PPC64_DTPREL16_HIGH:
|
||
|
+ case R_PPC64_DTPREL16_HIGHA:
|
||
|
case R_PPC64_DTPREL16_HIGHER:
|
||
|
case R_PPC64_DTPREL16_HIGHERA:
|
||
|
case R_PPC64_DTPREL16_HIGHEST:
|
||
|
@@ -13597,6 +13715,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||
|
case R_PPC64_ADDR16_DS:
|
||
|
case R_PPC64_ADDR16_HA:
|
||
|
case R_PPC64_ADDR16_HI:
|
||
|
+ case R_PPC64_ADDR16_HIGH:
|
||
|
+ case R_PPC64_ADDR16_HIGHA:
|
||
|
case R_PPC64_ADDR16_HIGHER:
|
||
|
case R_PPC64_ADDR16_HIGHERA:
|
||
|
case R_PPC64_ADDR16_HIGHEST:
|
||
|
@@ -13911,21 +14031,20 @@ ppc64_elf_relocate_section (bfd *output_bfd,
|
||
|
default:
|
||
|
break;
|
||
|
|
||
|
- case R_PPC64_ADDR16_HA:
|
||
|
case R_PPC64_REL16_HA:
|
||
|
+ case R_PPC64_ADDR16_HA:
|
||
|
+ case R_PPC64_ADDR16_HIGHA:
|
||
|
case R_PPC64_ADDR16_HIGHERA:
|
||
|
case R_PPC64_ADDR16_HIGHESTA:
|
||
|
case R_PPC64_TOC16_HA:
|
||
|
case R_PPC64_SECTOFF_HA:
|
||
|
case R_PPC64_TPREL16_HA:
|
||
|
- case R_PPC64_DTPREL16_HA:
|
||
|
- case R_PPC64_TPREL16_HIGHER:
|
||
|
+ case R_PPC64_TPREL16_HIGHA:
|
||
|
case R_PPC64_TPREL16_HIGHERA:
|
||
|
- case R_PPC64_TPREL16_HIGHEST:
|
||
|
case R_PPC64_TPREL16_HIGHESTA:
|
||
|
- case R_PPC64_DTPREL16_HIGHER:
|
||
|
+ case R_PPC64_DTPREL16_HA:
|
||
|
+ case R_PPC64_DTPREL16_HIGHA:
|
||
|
case R_PPC64_DTPREL16_HIGHERA:
|
||
|
- case R_PPC64_DTPREL16_HIGHEST:
|
||
|
case R_PPC64_DTPREL16_HIGHESTA:
|
||
|
/* It's just possible that this symbol is a weak symbol
|
||
|
that's not actually defined anywhere. In that case,
|
||
|
--- a/bfd/libbfd.h
|
||
|
+++ b/bfd/libbfd.h
|
||
|
@@ -1397,6 +1397,8 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
||
|
"BFD_RELOC_PPC64_TOC16_LO_DS",
|
||
|
"BFD_RELOC_PPC64_PLTGOT16_DS",
|
||
|
"BFD_RELOC_PPC64_PLTGOT16_LO_DS",
|
||
|
+ "BFD_RELOC_PPC64_ADDR16_HIGH",
|
||
|
+ "BFD_RELOC_PPC64_ADDR16_HIGHA",
|
||
|
"BFD_RELOC_PPC_TLS",
|
||
|
"BFD_RELOC_PPC_TLSGD",
|
||
|
"BFD_RELOC_PPC_TLSLD",
|
||
|
@@ -1439,6 +1441,10 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
|
||
|
"BFD_RELOC_PPC64_DTPREL16_HIGHERA",
|
||
|
"BFD_RELOC_PPC64_DTPREL16_HIGHEST",
|
||
|
"BFD_RELOC_PPC64_DTPREL16_HIGHESTA",
|
||
|
+ "BFD_RELOC_PPC64_TPREL16_HIGH",
|
||
|
+ "BFD_RELOC_PPC64_TPREL16_HIGHA",
|
||
|
+ "BFD_RELOC_PPC64_DTPREL16_HIGH",
|
||
|
+ "BFD_RELOC_PPC64_DTPREL16_HIGHA",
|
||
|
"BFD_RELOC_I370_D12",
|
||
|
"BFD_RELOC_CTOR",
|
||
|
"BFD_RELOC_ARM_PCREL_BRANCH",
|
||
|
--- a/bfd/reloc.c
|
||
|
+++ b/bfd/reloc.c
|
||
|
@@ -2891,6 +2891,10 @@ ENUMX
|
||
|
BFD_RELOC_PPC64_PLTGOT16_DS
|
||
|
ENUMX
|
||
|
BFD_RELOC_PPC64_PLTGOT16_LO_DS
|
||
|
+ENUMX
|
||
|
+ BFD_RELOC_PPC64_ADDR16_HIGH
|
||
|
+ENUMX
|
||
|
+ BFD_RELOC_PPC64_ADDR16_HIGHA
|
||
|
ENUMDOC
|
||
|
Power(rs6000) and PowerPC relocations.
|
||
|
|
||
|
@@ -2978,6 +2982,14 @@ ENUMX
|
||
|
BFD_RELOC_PPC64_DTPREL16_HIGHEST
|
||
|
ENUMX
|
||
|
BFD_RELOC_PPC64_DTPREL16_HIGHESTA
|
||
|
+ENUMX
|
||
|
+ BFD_RELOC_PPC64_TPREL16_HIGH
|
||
|
+ENUMX
|
||
|
+ BFD_RELOC_PPC64_TPREL16_HIGHA
|
||
|
+ENUMX
|
||
|
+ BFD_RELOC_PPC64_DTPREL16_HIGH
|
||
|
+ENUMX
|
||
|
+ BFD_RELOC_PPC64_DTPREL16_HIGHA
|
||
|
ENUMDOC
|
||
|
PowerPC and PowerPC64 thread-local storage relocations.
|
||
|
|
||
|
### a/include/elf/ChangeLog
|
||
|
### b/include/elf/ChangeLog
|
||
|
## -1,3 +1,10 @@
|
||
|
+2013-10-30 Alan Modra <amodra@gmail.com>
|
||
|
+
|
||
|
+ * ppc64.h (R_PPC64_ADDR16_HIGH, R_PPC64_ADDR16_HIGHA,
|
||
|
+ R_PPC64_TPREL16_HIGH, R_PPC64_TPREL16_HIGHA,
|
||
|
+ R_PPC64_DTPREL16_HIGH, R_PPC64_DTPREL16_HIGHA): New.
|
||
|
+ (IS_PPC64_TLS_RELOC): Match new tls relocs.
|
||
|
+
|
||
|
2013-10-14 Chao-ying Fu <Chao-ying.Fu@imgtec.com>
|
||
|
|
||
|
* mips.h (enum): Add Tag_GNU_MIPS_ABI_MSA.
|
||
|
--- a/include/elf/ppc64.h
|
||
|
+++ b/include/elf/ppc64.h
|
||
|
@@ -141,6 +141,14 @@ START_RELOC_NUMBERS (elf_ppc64_reloc_type)
|
||
|
RELOC_NUMBER (R_PPC64_TLSLD, 108)
|
||
|
RELOC_NUMBER (R_PPC64_TOCSAVE, 109)
|
||
|
|
||
|
+/* Added when HA and HI relocs were changed to report overflows. */
|
||
|
+ RELOC_NUMBER (R_PPC64_ADDR16_HIGH, 110)
|
||
|
+ RELOC_NUMBER (R_PPC64_ADDR16_HIGHA, 111)
|
||
|
+ RELOC_NUMBER (R_PPC64_TPREL16_HIGH, 112)
|
||
|
+ RELOC_NUMBER (R_PPC64_TPREL16_HIGHA, 113)
|
||
|
+ RELOC_NUMBER (R_PPC64_DTPREL16_HIGH, 114)
|
||
|
+ RELOC_NUMBER (R_PPC64_DTPREL16_HIGHA, 115)
|
||
|
+
|
||
|
#ifndef RELOC_MACROS_GEN_FUNC
|
||
|
/* Fake relocation only used internally by ld. */
|
||
|
RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128)
|
||
|
@@ -161,8 +169,9 @@ START_RELOC_NUMBERS (elf_ppc64_reloc_type)
|
||
|
|
||
|
END_RELOC_NUMBERS (R_PPC64_max)
|
||
|
|
||
|
-#define IS_PPC64_TLS_RELOC(R) \
|
||
|
- ((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA)
|
||
|
+#define IS_PPC64_TLS_RELOC(R) \
|
||
|
+ (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \
|
||
|
+ || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA))
|
||
|
|
||
|
/* Specify the start of the .glink section. */
|
||
|
#define DT_PPC64_GLINK DT_LOPROC
|