diff options
| author | Michael J. Spencer <bigcheesegs@gmail.com> | 2013-10-24 21:00:25 +0000 |
|---|---|---|
| committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2013-10-24 21:00:25 +0000 |
| commit | 2fd6c7d91c90db84b43cc04fb4b5c00422e77e3c (patch) | |
| tree | 3f7ecc2672b4d474288374f3460590eb324244af | |
| parent | eeae72184b4efc76385ee33143fcaa9198a1a07a (diff) | |
| download | bcm5719-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.cpp | 5 | ||||
| -rw-r--r-- | lld/test/elf/Inputs/use-shared-32s.c | 8 | ||||
| -rw-r--r-- | lld/test/elf/Inputs/use-shared-32s.x86-64 | bin | 0 -> 1336 bytes | |||
| -rw-r--r-- | lld/test/elf/x86-64-dynamic.test | 11 |
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 Binary files differnew file mode 100644 index 00000000000..7e223677b93 --- /dev/null +++ b/lld/test/elf/Inputs/use-shared-32s.x86-64 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 |

