From ead3d5427a2df5e33316d4ad045510c1d2078c2a Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 1 Dec 2015 14:45:51 -0800 Subject: Properly check symbol defined by assignment in linker script Symbol defined by a linker assignment may have type bfd_link_hash_new or bfd_link_hash_undefined. And h->def_regular is always set. elf_i386_convert_load and elf_x86_64_convert_load should check h->def_regular as well as bfd_link_hash_undefined and bfd_link_hash_new to see if a symbol is defined by a linker script. bfd/ PR ld/19319 * elf32-i386.c (elf_i386_convert_load): Check h->def_regular instead of bfd_link_hash_new. * elf64-x86-64.c (elf_x86_64_convert_load): Likewise. Skip relocation overflow for bfd_link_hash_undefined and bfd_link_hash_new if h->def_regular is set. ld/testsuite/ PR ld/19319 * ld-i386/i386.exp: Run pr19319 test. * ld-x86-64/x86-64.exp: Likewise. * ld-i386/pr19319.dd: New file. * ld-i386/pr19319a.S: Likewise. * ld-i386/pr19319b.S: Likewise. * ld-x86-64/pr19319.dd: Likewise. * ld-x86-64/pr19319a.S: Likewise. * ld-x86-64/pr19319b.S: Likewise. --- ld/testsuite/ld-i386/i386.exp | 16 ++++++++++++++++ ld/testsuite/ld-i386/pr19319.dd | 4 ++++ ld/testsuite/ld-i386/pr19319a.S | 11 +++++++++++ ld/testsuite/ld-i386/pr19319b.S | 11 +++++++++++ 4 files changed, 42 insertions(+) create mode 100644 ld/testsuite/ld-i386/pr19319.dd create mode 100644 ld/testsuite/ld-i386/pr19319a.S create mode 100644 ld/testsuite/ld-i386/pr19319b.S (limited to 'ld/testsuite/ld-i386') diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp index 84a63e8..a6601ed 100644 --- a/ld/testsuite/ld-i386/i386.exp +++ b/ld/testsuite/ld-i386/i386.exp @@ -537,6 +537,22 @@ if { [isnative] {{objdump {-dw} got1.dd}} \ "got1" \ ] \ + [list \ + "Build pr19319.so" \ + "-shared" \ + "" \ + { pr19319a.S } \ + "" \ + "pr19319.so" \ + ] \ + [list \ + "Build pr19319" \ + "-pie -nostdlib -nostartfiles tmpdir/pr19319.so" \ + "" \ + { pr19319b.S } \ + {{objdump {-dw} pr19319.dd}} \ + "pr19319" \ + ] \ ] run_ld_link_exec_tests [] [list \ diff --git a/ld/testsuite/ld-i386/pr19319.dd b/ld/testsuite/ld-i386/pr19319.dd new file mode 100644 index 0000000..f2593da --- /dev/null +++ b/ld/testsuite/ld-i386/pr19319.dd @@ -0,0 +1,4 @@ +#... +[a-f0-9]+ <_start>: +[ ]*[a-f0-9]+: 8d 81 ([0-9a-f]{2} ){4} * lea 0x[a-f0-9]+\(%ecx\),%eax +#pass diff --git a/ld/testsuite/ld-i386/pr19319a.S b/ld/testsuite/ld-i386/pr19319a.S new file mode 100644 index 0000000..04082be --- /dev/null +++ b/ld/testsuite/ld-i386/pr19319a.S @@ -0,0 +1,11 @@ + .text + .globl foo + .type foo, @function +foo: + movl __start_my_section@GOT(%ecx), %eax + ret + .size foo, .-foo + .section my_section,"aw",@progbits + .align 8 + .long 4660 + .long 22136 diff --git a/ld/testsuite/ld-i386/pr19319b.S b/ld/testsuite/ld-i386/pr19319b.S new file mode 100644 index 0000000..98294f6 --- /dev/null +++ b/ld/testsuite/ld-i386/pr19319b.S @@ -0,0 +1,11 @@ + .text + .globl _start + .type _start, @function +_start: + movl __start_my_section@GOT(%ecx), %eax + ret + .size _start, .-_start + .section my_section,"aw",@progbits + .align 8 + .long 4660 + .long 22136 -- cgit v1.1