Force the AArch64 linker backend to refuse to link when it encounters unresoleable relocations.
* reloc.c (enum bfd_reloc_status): Start values at 2. * bfd-in2.h: Regenerate. * elfnn-aarch64.c (aarch64_relocate): Invert sense of function, so that a TRUE return indicates success. Compare the result of calling _bfd_aarch64_elf_put_addend against bfd_reloc_ok. (build_one_stub): Change sense of tests against aarch64_relocate return value. (elfNN_aarch64_tls_relax): Return bfd_reloc_notsupported, rather than FALSE, when an error is detected. (elfNN_aarch64_final_link_relocate): Likewise. * testsuite/ld-aarch64/pcrel_pic_defined.d: Expect errors not warnings. Expect errors about unsupported relocations. * testsuite/ld-aarch64/pcrel_pic_undefined.d: Likewise.
This commit is contained in:
parent
9f8575350f
commit
1d75a8e26e
@ -1,3 +1,16 @@
|
|||||||
|
2017-10-12 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* reloc.c (enum bfd_reloc_status): Start values at 2.
|
||||||
|
* bfd-in2.h: Regenerate.
|
||||||
|
* elfnn-aarch64.c (aarch64_relocate): Invert sense of function, so
|
||||||
|
that a TRUE return indicates success. Compare the result of
|
||||||
|
calling _bfd_aarch64_elf_put_addend against bfd_reloc_ok.
|
||||||
|
(build_one_stub): Change sense of tests against aarch64_relocate
|
||||||
|
return value.
|
||||||
|
(elfNN_aarch64_tls_relax): Return bfd_reloc_notsupported, rather
|
||||||
|
than FALSE, when an error is detected.
|
||||||
|
(elfNN_aarch64_final_link_relocate): Likewise.
|
||||||
|
|
||||||
2017-10-12 H.J. Lu <hongjiu.lu@intel.com>
|
2017-10-12 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elf32-i386.c (elf_backend_hide_symbol): New.
|
* elf32-i386.c (elf_backend_hide_symbol): New.
|
||||||
|
@ -2466,8 +2466,9 @@ unsigned int bfd_arch_mach_octets_per_byte
|
|||||||
|
|
||||||
typedef enum bfd_reloc_status
|
typedef enum bfd_reloc_status
|
||||||
{
|
{
|
||||||
/* No errors detected. */
|
/* No errors detected. Note - the value 2 is used so that it
|
||||||
bfd_reloc_ok,
|
will not be mistaken for the boolean TRUE or FALSE values. */
|
||||||
|
bfd_reloc_ok = 2,
|
||||||
|
|
||||||
/* The relocation was performed, but there was an overflow. */
|
/* The relocation was performed, but there was an overflow. */
|
||||||
bfd_reloc_overflow,
|
bfd_reloc_overflow,
|
||||||
|
@ -2610,6 +2610,8 @@ elfNN_aarch64_link_hash_table_create (bfd *abfd)
|
|||||||
return &ret->root.root;
|
return &ret->root.root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Perform relocation R_TYPE. Returns TRUE upon success, FALSE otherwise. */
|
||||||
|
|
||||||
static bfd_boolean
|
static bfd_boolean
|
||||||
aarch64_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section,
|
aarch64_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section,
|
||||||
bfd_vma offset, bfd_vma value)
|
bfd_vma offset, bfd_vma value)
|
||||||
@ -2625,7 +2627,7 @@ aarch64_relocate (unsigned int r_type, bfd *input_bfd, asection *input_section,
|
|||||||
value = _bfd_aarch64_elf_resolve_relocation (r_type, place, value, 0, FALSE);
|
value = _bfd_aarch64_elf_resolve_relocation (r_type, place, value, 0, FALSE);
|
||||||
return _bfd_aarch64_elf_put_addend (input_bfd,
|
return _bfd_aarch64_elf_put_addend (input_bfd,
|
||||||
input_section->contents + offset, r_type,
|
input_section->contents + offset, r_type,
|
||||||
howto, value);
|
howto, value) == bfd_reloc_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum elf_aarch64_stub_type
|
static enum elf_aarch64_stub_type
|
||||||
@ -2965,22 +2967,22 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry,
|
|||||||
switch (stub_entry->stub_type)
|
switch (stub_entry->stub_type)
|
||||||
{
|
{
|
||||||
case aarch64_stub_adrp_branch:
|
case aarch64_stub_adrp_branch:
|
||||||
if (aarch64_relocate (AARCH64_R (ADR_PREL_PG_HI21), stub_bfd, stub_sec,
|
if (!aarch64_relocate (AARCH64_R (ADR_PREL_PG_HI21), stub_bfd, stub_sec,
|
||||||
stub_entry->stub_offset, sym_value))
|
stub_entry->stub_offset, sym_value))
|
||||||
/* The stub would not have been relaxed if the offset was out
|
/* The stub would not have been relaxed if the offset was out
|
||||||
of range. */
|
of range. */
|
||||||
BFD_FAIL ();
|
BFD_FAIL ();
|
||||||
|
|
||||||
if (aarch64_relocate (AARCH64_R (ADD_ABS_LO12_NC), stub_bfd, stub_sec,
|
if (!aarch64_relocate (AARCH64_R (ADD_ABS_LO12_NC), stub_bfd, stub_sec,
|
||||||
stub_entry->stub_offset + 4, sym_value))
|
stub_entry->stub_offset + 4, sym_value))
|
||||||
BFD_FAIL ();
|
BFD_FAIL ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case aarch64_stub_long_branch:
|
case aarch64_stub_long_branch:
|
||||||
/* We want the value relative to the address 12 bytes back from the
|
/* We want the value relative to the address 12 bytes back from the
|
||||||
value itself. */
|
value itself. */
|
||||||
if (aarch64_relocate (AARCH64_R (PRELNN), stub_bfd, stub_sec,
|
if (!aarch64_relocate (AARCH64_R (PRELNN), stub_bfd, stub_sec,
|
||||||
stub_entry->stub_offset + 16, sym_value + 12))
|
stub_entry->stub_offset + 16, sym_value + 12))
|
||||||
BFD_FAIL ();
|
BFD_FAIL ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3001,8 +3003,8 @@ aarch64_build_one_stub (struct bfd_hash_entry *gen_entry,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case aarch64_stub_erratum_843419_veneer:
|
case aarch64_stub_erratum_843419_veneer:
|
||||||
if (aarch64_relocate (AARCH64_R (JUMP26), stub_bfd, stub_sec,
|
if (!aarch64_relocate (AARCH64_R (JUMP26), stub_bfd, stub_sec,
|
||||||
stub_entry->stub_offset + 4, sym_value + 4))
|
stub_entry->stub_offset + 4, sym_value + 4))
|
||||||
BFD_FAIL ();
|
BFD_FAIL ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -4998,7 +5000,7 @@ elfNN_aarch64_final_link_relocate (reloc_howto_type *howto,
|
|||||||
(_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
|
(_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"),
|
||||||
input_bfd, input_section, rel->r_offset, howto->name, name);
|
input_bfd, input_section, rel->r_offset, howto->name, name);
|
||||||
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
||||||
return FALSE;
|
return bfd_reloc_notsupported;
|
||||||
}
|
}
|
||||||
else if (h->plt.offset == (bfd_vma) -1)
|
else if (h->plt.offset == (bfd_vma) -1)
|
||||||
goto bad_ifunc_reloc;
|
goto bad_ifunc_reloc;
|
||||||
@ -5022,7 +5024,7 @@ bad_ifunc_reloc:
|
|||||||
"symbol `%s' isn't handled by %s"), input_bfd,
|
"symbol `%s' isn't handled by %s"), input_bfd,
|
||||||
howto->name, name, __FUNCTION__);
|
howto->name, name, __FUNCTION__);
|
||||||
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
||||||
return FALSE;
|
return bfd_reloc_notsupported;
|
||||||
|
|
||||||
case BFD_RELOC_AARCH64_NN:
|
case BFD_RELOC_AARCH64_NN:
|
||||||
if (rel->r_addend != 0)
|
if (rel->r_addend != 0)
|
||||||
@ -5038,7 +5040,7 @@ bad_ifunc_reloc:
|
|||||||
"symbol `%s' has non-zero addend: %Ld"),
|
"symbol `%s' has non-zero addend: %Ld"),
|
||||||
input_bfd, howto->name, name, rel->r_addend);
|
input_bfd, howto->name, name, rel->r_addend);
|
||||||
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
||||||
return FALSE;
|
return bfd_reloc_notsupported;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generate dynamic relocation only when there is a
|
/* Generate dynamic relocation only when there is a
|
||||||
@ -5362,7 +5364,7 @@ bad_ifunc_reloc:
|
|||||||
input_bfd, elfNN_aarch64_howto_table[howto_index].name,
|
input_bfd, elfNN_aarch64_howto_table[howto_index].name,
|
||||||
h->root.root.string);
|
h->root.root.string);
|
||||||
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
||||||
return FALSE;
|
return bfd_reloc_notsupported;
|
||||||
}
|
}
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
@ -8766,7 +8768,8 @@ elf_aarch64_update_plt_entry (bfd *output_bfd,
|
|||||||
{
|
{
|
||||||
reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (r_type);
|
reloc_howto_type *howto = elfNN_aarch64_howto_from_bfd_reloc (r_type);
|
||||||
|
|
||||||
_bfd_aarch64_elf_put_addend (output_bfd, plt_entry, r_type, howto, value);
|
/* FIXME: We should check the return value from this function call. */
|
||||||
|
(void) _bfd_aarch64_elf_put_addend (output_bfd, plt_entry, r_type, howto, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -65,8 +65,9 @@ CODE_FRAGMENT
|
|||||||
.
|
.
|
||||||
.typedef enum bfd_reloc_status
|
.typedef enum bfd_reloc_status
|
||||||
.{
|
.{
|
||||||
. {* No errors detected. *}
|
. {* No errors detected. Note - the value 2 is used so that it
|
||||||
. bfd_reloc_ok,
|
. will not be mistaken for the boolean TRUE or FALSE values. *}
|
||||||
|
. bfd_reloc_ok = 2,
|
||||||
.
|
.
|
||||||
. {* The relocation was performed, but there was an overflow. *}
|
. {* The relocation was performed, but there was an overflow. *}
|
||||||
. bfd_reloc_overflow,
|
. bfd_reloc_overflow,
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2017-10-12 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* testsuite/ld-aarch64/pcrel_pic_defined.d: Expect errors not
|
||||||
|
warnings. Expect errors about unsupported relocations.
|
||||||
|
* testsuite/ld-aarch64/pcrel_pic_undefined.d: Likewise.
|
||||||
|
|
||||||
2017-10-12 H.J. Lu <hongjiu.lu@intel.com>
|
2017-10-12 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* testsuite/ld-elf/pr22269b.d: Expect warning of
|
* testsuite/ld-elf/pr22269b.d: Expect warning of
|
||||||
|
@ -1,10 +1,17 @@
|
|||||||
#name: PC-Rel relocation against defined
|
#name: PC-Rel relocation against defined
|
||||||
#source: pcrel.s
|
#source: pcrel.s
|
||||||
#ld: -shared -e0 -defsym global_a=0x1000 -defsym global_b=0x2000
|
#ld: -shared -e0 -defsym global_a=0x1000 -defsym global_b=0x2000
|
||||||
#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
#warning: .*: relocation R_AARCH64_ADR_PREL_LO21 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against symbol `global_a.*bind externally.*fPIC.*
|
||||||
#warning: .*: relocation R_AARCH64_LD_PREL_LO19 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
#warning: .*: relocation R_AARCH64_PREL16 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_ADR_PREL_LO21 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
#warning: .*: relocation R_AARCH64_PREL32 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
#warning: .*: relocation R_AARCH64_PREL64 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_LD_PREL_LO19 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
#error: .*: relocation R_AARCH64_PREL16 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
#error: .*: relocation R_AARCH64_PREL32 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
#error: .*: relocation R_AARCH64_PREL64 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
@ -1,10 +1,17 @@
|
|||||||
#name: PC-Rel relocation against undefined
|
#name: PC-Rel relocation against undefined
|
||||||
#source: pcrel.s
|
#source: pcrel.s
|
||||||
#ld: -shared -e0 -defsym global_b=0x2000
|
#ld: -shared -e0 -defsym global_b=0x2000
|
||||||
#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
#warning: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
#warning: .*: relocation R_AARCH64_ADR_PREL_LO21 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_ADR_PREL_PG_HI21_NC against symbol `global_a.*bind externally.*fPIC.*
|
||||||
#warning: .*: relocation R_AARCH64_LD_PREL_LO19 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
#warning: .*: relocation R_AARCH64_PREL16 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_ADR_PREL_LO21 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
#warning: .*: relocation R_AARCH64_PREL32 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
#warning: .*: relocation R_AARCH64_PREL64 against symbol `global_a.*bind externally.*fPIC.*
|
#error: .*: relocation R_AARCH64_LD_PREL_LO19 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
#error: .*: relocation R_AARCH64_PREL16 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
#error: .*: relocation R_AARCH64_PREL32 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
#error: .*: relocation R_AARCH64_PREL64 against symbol `global_a.*bind externally.*fPIC.*
|
||||||
|
#error: .*: dangerous relocation: unsupported relocation
|
||||||
|
Loading…
x
Reference in New Issue
Block a user