hc
2023-11-22 f743a7adbd6e230d66a6206fa115b59fec2d88eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
From 203b80f8dbdd3ddb860114b03351a0dea28c978f Mon Sep 17 00:00:00 2001
From: Giulio Benetti <giulio.benetti@benettiengineering.com>
Date: Sat, 10 Jul 2021 17:57:34 +0200
Subject: [PATCH] or1k: fix pc-relative relocation against dynamic on PC
 relative 26 bit relocation
 
When building openal we were seeing the assert failure:
 
/home/buildroot/autobuild/run/instance-0/output-1/host/opt/ext-toolchain/bin/../lib/gcc/or1k-buildroot-linux-uclibc/9.3.0/../../../../or1k-buildroot-linux-uclibc/bin/ld: CMakeFiles/OpenAL.dir/al/source.cpp.o:
pc-relative relocation against dynamic symbol alSourcePausev
/home/buildroot/autobuild/run/instance-0/output-1/host/opt/ext-toolchain/bin/../lib/gcc/or1k-buildroot-linux-uclibc/9.3.0/../../../../or1k-buildroot-linux-uclibc/bin/ld: CMakeFiles/OpenAL.dir/al/source.cpp.o:
pc-relative relocation against dynamic symbol alSourceStopv
/home/buildroot/autobuild/run/instance-0/output-1/host/opt/ext-toolchain/bin/../lib/gcc/or1k-buildroot-linux-uclibc/9.3.0/../../../../or1k-buildroot-linux-uclibc/bin/ld: CMakeFiles/OpenAL.dir/al/source.cpp.o:
pc-relative relocation against dynamic symbol alSourceRewindv
/home/buildroot/autobuild/run/instance-0/output-1/host/opt/ext-toolchain/bin/../lib/gcc/or1k-buildroot-linux-uclibc/9.3.0/../../../../or1k-buildroot-linux-uclibc/bin/ld: CMakeFiles/OpenAL.dir/al/source.cpp.o:
pc-relative relocation against dynamic symbol alSourcePlayv
collect2: error: ld returned 1 exit status
 
This happens because in R_OR1K_INSN_REL_26 case we can't reference local
symbol as previously done but we need to make sure that calls to actual
symbol always call the version of current object.
 
bfd/Changelog:
 
   * elf32-or1k.c (or1k_elf_relocate_section): use a separate entry
     in switch case R_OR1K_INSN_REL_26 where we need to check for
     !SYMBOL_CALLS_LOCAL() instead of !SYMBOL_REFERENCES_LOCAL().
 
Signed-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com>
---
 bfd/elf32-or1k.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 
diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c
index 32063ab0289..67252394173 100644
--- a/bfd/elf32-or1k.c
+++ b/bfd/elf32-or1k.c
@@ -1543,6 +1543,18 @@ or1k_elf_relocate_section (bfd *output_bfd,
       break;
 
     case R_OR1K_INSN_REL_26:
+      /* For a non-shared link, these will reference plt or call the
+         version of actual object.  */
+      if (bfd_link_pic (info) && !SYMBOL_CALLS_LOCAL (info, h))
+        {
+          _bfd_error_handler
+        (_("%pB: pc-relative relocation against dynamic symbol %s"),
+         input_bfd, name);
+          ret_val = false;
+          bfd_set_error (bfd_error_bad_value);
+        }
+      break;
+
     case R_OR1K_PCREL_PG21:
     case R_OR1K_LO13:
     case R_OR1K_SLO13:
-- 
2.31.1