diff options
-rw-r--r-- | bfd/elfnn-riscv.c | 71 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/lib-nopic-01a.s | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/lib-nopic-01b.d | 5 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/lib-nopic-01b.s | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s | 12 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d | 14 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d | 15 | ||||
-rw-r--r-- | ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s | 14 |
13 files changed, 126 insertions, 57 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 86cb207..0e0a0b0 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -2457,12 +2457,44 @@ riscv_elf_relocate_section (bfd *output_bfd, case R_RISCV_JAL: case R_RISCV_RVC_JUMP: - /* This line has to match the check in _bfd_riscv_relax_section. */ - if (bfd_link_pic (info) && h != NULL && h->plt.offset != MINUS_ONE) + if (bfd_link_pic (info) && h != NULL) { - /* Refer to the PLT entry. */ - relocation = sec_addr (htab->elf.splt) + h->plt.offset; - unresolved_reloc = false; + if (h->plt.offset != MINUS_ONE) + { + /* Refer to the PLT entry. This check has to match the + check in _bfd_riscv_relax_section. */ + relocation = sec_addr (htab->elf.splt) + h->plt.offset; + unresolved_reloc = false; + } + else if (!SYMBOL_REFERENCES_LOCAL (info, h) + && (input_section->flags & SEC_ALLOC) != 0 + && (input_section->flags & SEC_READONLY) != 0 + && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) + { + /* PR 28509, when generating the shared object, these + referenced symbols may bind externally, which means + they will be exported to the dynamic symbol table, + and are preemptible by default. These symbols cannot + be referenced by the non-pic relocations, like + R_RISCV_JAL and R_RISCV_RVC_JUMP relocations. + + However, consider that linker may relax the R_RISCV_CALL + relocations to R_RISCV_JAL or R_RISCV_RVC_JUMP, if + these relocations are relocated to the plt entries, + then we won't report error for them. + + Perhaps we also need the similar checks for the + R_RISCV_BRANCH and R_RISCV_RVC_BRANCH relocations. */ + if (asprintf (&msg_buf, + _("%%X%%P: relocation %s against `%s' which " + "may bind externally can not be used when " + "making a shared object; recompile " + "with -fPIC\n"), + howto->name, h->root.root.string) == -1) + msg_buf = NULL; + msg = msg_buf; + r = bfd_reloc_notsupported; + } } break; @@ -2755,29 +2787,12 @@ riscv_elf_relocate_section (bfd *output_bfd, && _bfd_elf_section_offset (output_bfd, info, input_section, rel->r_offset) != (bfd_vma) -1) { - switch (r_type) - { - case R_RISCV_JAL: - case R_RISCV_RVC_JUMP: - if (asprintf (&msg_buf, - _("%%X%%P: relocation %s against `%s' can " - "not be used when making a shared object; " - "recompile with -fPIC\n"), - howto->name, - h->root.root.string) == -1) - msg_buf = NULL; - break; - - default: - if (asprintf (&msg_buf, - _("%%X%%P: unresolvable %s relocation against " - "symbol `%s'\n"), - howto->name, - h->root.root.string) == -1) - msg_buf = NULL; - break; - } - + if (asprintf (&msg_buf, + _("%%X%%P: unresolvable %s relocation against " + "symbol `%s'\n"), + howto->name, + h->root.root.string) == -1) + msg_buf = NULL; msg = msg_buf; r = bfd_reloc_notsupported; } diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp index 272424b..df89e0e 100644 --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp @@ -210,12 +210,10 @@ if [istarget "riscv*-*-*"] { "gp-test-${abi}"]] } - run_ld_link_tests { - { "Link non-pic code into a shared library (setup)" - "-shared" "" "" {lib-nopic-01a.s} - {} "lib-nopic-01a.so" } - } - run_dump_test "lib-nopic-01b" + run_dump_test "shared-lib-nopic-01" + run_dump_test "shared-lib-nopic-02" + run_dump_test "shared-lib-nopic-03" + run_dump_test "shared-lib-nopic-04" # IFUNC testcases. # Check IFUNC by single type relocs. diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s deleted file mode 100644 index 632875d..0000000 --- a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s +++ /dev/null @@ -1,9 +0,0 @@ - .option nopic - .text - .align 1 - .globl func1 - .type func1, @function -func1: - jal func2 - jr ra - .size func1, .-func1 diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d deleted file mode 100644 index 1c2c907..0000000 --- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d +++ /dev/null @@ -1,5 +0,0 @@ -#name: link non-pic code into a shared library -#source: lib-nopic-01b.s -#as: -#ld: -shared tmpdir/lib-nopic-01a.so -#error: .*relocation R_RISCV_JAL against `func1' can not be used when making a shared object; recompile with -fPIC diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s deleted file mode 100644 index ea7b029..0000000 --- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s +++ /dev/null @@ -1,9 +0,0 @@ - .option nopic - .text - .align 1 - .globl func2 - .type func2, @function -func2: - jal func1 - jr ra - .size func2, .-func2 diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d new file mode 100644 index 0000000..2ea8512 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.d @@ -0,0 +1,4 @@ +#source: shared-lib-nopic-01.s +#as: +#ld: -shared +#error: .*relocation R_RISCV_JAL against `foo' which may bind externally can not be used when making a shared object; recompile with -fPIC diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s new file mode 100644 index 0000000..8d85c17 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-01.s @@ -0,0 +1,3 @@ + .option nopic + .text + jal foo # undefined diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d new file mode 100644 index 0000000..f866d01 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.d @@ -0,0 +1,4 @@ +#source: shared-lib-nopic-02.s +#as: +#ld: -shared +#error: .*relocation R_RISCV_JAL against `foo_default' which may bind externally can not be used when making a shared object; recompile with -fPIC diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s new file mode 100644 index 0000000..61a8cc1 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-02.s @@ -0,0 +1,12 @@ + .option nopic + .text + .align 1 + + jal foo_default + + .globl foo_default + .type foo_default, @function +foo_default: + nop + ret + .size foo_default, .-foo_default diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d new file mode 100644 index 0000000..182a557 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.d @@ -0,0 +1,14 @@ +#source: shared-lib-nopic-03.s +#as: +#ld: -shared +#objdump: -d + +.*:[ ]+file format .* + +Disassembly of section \.text: + +#... +.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* <foo_default> + +0+[0-9a-f]+ <foo_default>: +#... diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s new file mode 100644 index 0000000..d1855f8 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-03.s @@ -0,0 +1,13 @@ + .option nopic + .text + .align 1 + + jal foo_default + + .globl foo_default + .hidden foo_default + .type foo_default, @function +foo_default: + nop + ret + .size foo_default, .-foo_default diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d new file mode 100644 index 0000000..e66b721 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.d @@ -0,0 +1,15 @@ +#source: shared-lib-nopic-04.s +#as: +#ld: -shared +#objdump: -d + +.*:[ ]+file format .* + +#... +Disassembly of section \.text: +#... +.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* <foo_default@plt> +.*:[ ]+[0-9a-f]+[ ]+jal[ ]+.* <foo_default@plt> + +0+[0-9a-f]+ <foo_default>: +#... diff --git a/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s new file mode 100644 index 0000000..46760f8 --- /dev/null +++ b/ld/testsuite/ld-riscv-elf/shared-lib-nopic-04.s @@ -0,0 +1,14 @@ + .option nopic + .text + .align 1 + + call foo_default + jal foo_default + + + .globl foo_default + .type foo_default, @function +foo_default: + nop + ret + .size foo_default, .-foo_default |