summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2013-10-24 21:00:25 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2013-10-24 21:00:25 +0000
commit2fd6c7d91c90db84b43cc04fb4b5c00422e77e3c (patch)
tree3f7ecc2672b4d474288374f3460590eb324244af
parenteeae72184b4efc76385ee33143fcaa9198a1a07a (diff)
downloadbcm5719-llvm-2fd6c7d91c90db84b43cc04fb4b5c00422e77e3c.tar.gz
bcm5719-llvm-2fd6c7d91c90db84b43cc04fb4b5c00422e77e3c.zip
[ELF][x86-64] Generate PLT for R_*_32S relocs.
llvm-svn: 193369
-rw-r--r--lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp5
-rw-r--r--lld/test/elf/Inputs/use-shared-32s.c8
-rw-r--r--lld/test/elf/Inputs/use-shared-32s.x86-64bin0 -> 1336 bytes
-rw-r--r--lld/test/elf/x86-64-dynamic.test11
4 files changed, 23 insertions, 1 deletions
diff --git a/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp b/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp
index 5aeb1f95ac6..b67afec8511 100644
--- a/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp
+++ b/lld/lib/ReaderWriter/ELF/X86_64/X86_64LinkingContext.cpp
@@ -384,9 +384,12 @@ public:
}
ErrorOr<void> handle32S(const Reference &ref) {
- if (auto sla = dyn_cast_or_null<SharedLibraryAtom>(ref.target()))
+ if (auto sla = dyn_cast_or_null<SharedLibraryAtom>(ref.target())) {
if (sla->type() == SharedLibraryAtom::Type::Data)
const_cast<Reference &>(ref).setTarget(getObjectEntry(sla));
+ else if (sla->type() == SharedLibraryAtom::Type::Code)
+ const_cast<Reference &>(ref).setTarget(getPLTEntry(sla));
+ }
return error_code::success();
}
diff --git a/lld/test/elf/Inputs/use-shared-32s.c b/lld/test/elf/Inputs/use-shared-32s.c
new file mode 100644
index 00000000000..63054cb036e
--- /dev/null
+++ b/lld/test/elf/Inputs/use-shared-32s.c
@@ -0,0 +1,8 @@
+void foo();
+
+void (*func)();
+
+int main() {
+ func = foo;
+ func();
+}
diff --git a/lld/test/elf/Inputs/use-shared-32s.x86-64 b/lld/test/elf/Inputs/use-shared-32s.x86-64
new file mode 100644
index 00000000000..7e223677b93
--- /dev/null
+++ b/lld/test/elf/Inputs/use-shared-32s.x86-64
Binary files differ
diff --git a/lld/test/elf/x86-64-dynamic.test b/lld/test/elf/x86-64-dynamic.test
index 2529dc1b3c9..70dbd38a33e 100644
--- a/lld/test/elf/x86-64-dynamic.test
+++ b/lld/test/elf/x86-64-dynamic.test
@@ -4,6 +4,10 @@ RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/use-shared.x86-64 \
RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml -o %t1 --noinhibit-exec
RUN: FileCheck %s < %t1
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/use-shared-32s.x86-64 \
+RUN: %p/Inputs/shared.so-x86-64 --output-filetype=yaml --noinhibit-exec \
+RUN: | FileCheck %s --check-prefix=32S
+
// Don't check the GOT and PLT names as they are only present in assert builds.
CHECK: type: got
CHECK: content: [ 00, 00, 00, 00, 00, 00, 00, 00 ]
@@ -68,3 +72,10 @@ CHECK: addend: -4
CHECK:shared-library-atoms:
CHECK: - name: foo
CHECK: load-name: shared.so-x86-64
+
+32S: name: main
+32S: kind: R_X86_64_PC32
+32S: target: func
+32S: kind: R_X86_64_32S
+32S: kind: R_X86_64_PC32
+32S: type: stub
OpenPOWER on IntegriCloud