Add a more helpful warning message to explain why some AArch64 relocations can overflow.

bfd	* elfnn-aarch64.c (elfNN_aarch64_relocate_section): Add a more
	helpful warning message to explain why certain AArch64 relocs
	might overflow.

ld	* testsuite/ld-aarch64/reloc-overflow-bad.d: New test.
	* testsuite/ld-aarch64/reloc-overflow-1.s: New source file.
	* testsuite/ld-aarch64/reloc-overflow-2.s: New source file.
	* testsuite/ld-aarch64/aarch64-elf.exp: Run the new test.
This commit is contained in:
Nick Clifton 2016-02-09 09:56:21 +00:00
parent 24f5f69a8a
commit 2ea53e0031
7 changed files with 71 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2016-02-09 Nick Clifton <nickc@redhat.com>
* elfnn-aarch64.c (elfNN_aarch64_relocate_section): Add a more
helpful warning message to explain why certain AArch64 relocs
might overflow.
2016-02-05 Simon Marchi <simon.marchi@ericsson.com>
* pe-mips.c (coff_mips_reloc): Fix formatting.

View File

@ -6405,10 +6405,6 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
break;
}
if (!save_addend)
addend = 0;
/* Dynamic relocs are not propagated for SEC_DEBUGGING sections
because such sections are not SEC_ALLOC and thus ld.so will
not process them. */
@ -6448,6 +6444,34 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
name, input_bfd, input_section, rel->r_offset);
return FALSE;
}
/* Overflow can occur when a variable is referenced with a type
that has a larger alignment than the type with which it was
declared. eg:
file1.c: extern int foo; int a (void) { return foo; }
file2.c: char bar, foo, baz;
If the variable is placed into a data section at an offset
that is incompatible with the larger alignment requirement
overflow will occur. (Strictly speaking this is not overflow
but rather an alignment problem, but the bfd_reloc_ error
enum does not have a value to cover that situation).
Try to catch this situation here and provide a more helpful
error message to the user. */
if (addend & ((1 << howto->rightshift) - 1)
/* FIXME: Are we testing all of the appropriate reloc
types here ? */
&& (real_r_type == BFD_RELOC_AARCH64_LD_LO19_PCREL
|| real_r_type == BFD_RELOC_AARCH64_LDST16_LO12
|| real_r_type == BFD_RELOC_AARCH64_LDST32_LO12
|| real_r_type == BFD_RELOC_AARCH64_LDST64_LO12
|| real_r_type == BFD_RELOC_AARCH64_LDST128_LO12))
{
info->callbacks->warning
(info, _("One possible cause of this error is that the \
symbol is being referenced in the indicated code as if it had a larger \
alignment than was declared where it was defined."),
name, input_bfd, input_section, rel->r_offset);
}
break;
case bfd_reloc_undefined:
@ -6482,6 +6506,9 @@ elfNN_aarch64_relocate_section (bfd *output_bfd,
break;
}
}
if (!save_addend)
addend = 0;
}
return TRUE;

View File

@ -1,3 +1,10 @@
2016-02-09 Nick Clifton <nickc@redhat.com>
* testsuite/ld-aarch64/reloc-overflow-bad.d: New test.
* testsuite/ld-aarch64/reloc-overflow-1.s: New source file.
* testsuite/ld-aarch64/reloc-overflow-2.s: New source file.
* testsuite/ld-aarch64/aarch64-elf.exp: Run the new test.
2016-02-04 Nick Clifton <nickc@redhat.com>
* testsuite/ld-arm/arm-elf.exp: Remove ARM NOREAD section tests.

View File

@ -159,6 +159,8 @@ run_dump_test "emit-relocs-537"
run_dump_test "emit-relocs-537-overflow"
run_dump_test "emit-relocs-538"
run_dump_test "reloc-overflow-bad"
# test addend correctness when --emit-relocs specified for non-relocatable obj.
run_dump_test "emit-relocs-local-addend"
# test addend correctness when -r specified.
@ -281,9 +283,9 @@ run_dump_test "plt_mapping_symbol"
set aarch64elflinktests {
{"ld-aarch64/so with global symbol" "-shared" "" "" {copy-reloc-so.s}
{} "copy-reloc-so.so"}
{} "copy-reloc-so.so"}
{"ld-aarch64/exe with copy relocation" "-e0 tmpdir/copy-reloc-so.so" "" ""
{copy-reloc-exe.s} {{objdump -R copy-reloc.d}} "copy-reloc"}
{copy-reloc-exe.s} {{objdump -R copy-reloc.d}} "copy-reloc"}
}
run_ld_link_tests $aarch64elflinktests

View File

@ -0,0 +1,14 @@
.file "1.c"
.text
.align 2
.p2align 3,,7
.global dec
.arch armv8-a+fp+simd
//.tune generic
.type dec, %function
dec:
adrp x0, var_2
ldr w0, [x0, #:lo12:var_2]
ret
.size dec, .-dec
.ident "GCC: (GNU) 6.0.0 20160208 (experimental) [trunk revision 233206]"

View File

@ -0,0 +1,5 @@
.file "2.c"
.comm var_3,1,1
.comm var_2,1,1
.comm var_1,1,1
.ident "GCC: (GNU) 6.0.0 20160208 (experimental) [trunk revision 233206]"

View File

@ -0,0 +1,4 @@
#source: reloc-overflow-1.s
#source: reloc-overflow-2.s
#ld: -e0
#error: .*One possible cause.*