[PATCH] D34459: [ELF] Better handling of _GLOBAL_OFFSET_TABLE_
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 22 09:20:52 PDT 2017
The symbol is not always at the start of the got.
See D34355. This is a duplicate, no?
Cheers,
Rafael
Eugene Leviant via Phabricator <reviews at reviews.llvm.org> writes:
> evgeny777 updated this revision to Diff 103553.
> evgeny777 added a comment.
>
> Updated with a comment requested by @ruiu
>
>
> https://reviews.llvm.org/D34459
>
> Files:
> ELF/Relocations.cpp
> ELF/Symbols.cpp
> ELF/Symbols.h
> ELF/Writer.cpp
> test/ELF/arm-got-relative.s
> test/ELF/arm-got-relative2.s
>
> Index: test/ELF/arm-got-relative2.s
> ===================================================================
> --- test/ELF/arm-got-relative2.s
> +++ test/ELF/arm-got-relative2.s
> @@ -0,0 +1,52 @@
> +// REQUIRES: arm
> +// RUN: llvm-mc -position-independent -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o
> +// RUN: ld.lld %t.o -shared -o %t
> +// RUN: llvm-readobj -s -symbols -dyn-relocations %t | FileCheck %s
> +// RUN: llvm-objdump -d -triple=armv7a-none-linux-gnueabi %t | FileCheck -check-prefix=CODE %s
> + .syntax unified
> + .text
> + .globl _start
> + .align 2
> +_start:
> + .type _start, %function
> + ldr r3, .LGOT
> + ldr r2, .LGOT+4
> +.LPIC:
> + add r0, pc, r3
> + bx lr
> + .align 2
> +.LGOT:
> +
> +.word _GLOBAL_OFFSET_TABLE_ - (.LPIC+8)
> + .word function(GOT)
> +
> + .globl function
> + .align 2
> +function:
> + .type function, %function
> + bx lr
> +
> +// CHECK: Dynamic Relocations {
> +// CHECK-NEXT: 0x2048 R_ARM_GLOB_DAT function 0x0
> +
> +// CHECK: Name: _GLOBAL_OFFSET_TABLE_
> +// CHECK-NEXT: Value: 0x2048
> +// CHECK-NEXT: Size:
> +// CHECK-NEXT: Binding: Local
> +// CHECK-NEXT: Type: None
> +// CHECK-NEXT: Other [
> +// CHECK-NEXT: STV_HIDDEN
> +// CHECK-NEXT: ]
> +// CHECK-NEXT: Section: .got
> +
> +// CODE: Disassembly of section .text:
> +// CODE-NEXT: _start:
> +// CODE-NEXT: 1000: 08 30 9f e5 ldr r3, [pc, #8]
> +// CODE-NEXT: 1004: 08 20 9f e5 ldr r2, [pc, #8]
> +// CODE-NEXT: 1008: 03 00 8f e0 add r0, pc, r3
> +// CODE-NEXT: 100c: 1e ff 2f e1 bx lr
> +// CODE:$d.1:
> +// (_GLOBAL_OFFSET_TABLE_ = 0x2048) - (0x1008 + 8) 0x1038
> +// CODE-NEXT: 1010: 38 10 00 00
> +// (Got(function) - GotBase = 0x4
> +// CODE-NEXT: 1014: 00 00 00 00
> Index: test/ELF/arm-got-relative.s
> ===================================================================
> --- test/ELF/arm-got-relative.s
> +++ test/ELF/arm-got-relative.s
> @@ -31,7 +31,7 @@
> // CHECK-NEXT: 0x204C R_ARM_GLOB_DAT function 0x0
>
> // CHECK: Name: _GLOBAL_OFFSET_TABLE_
> -// CHECK-NEXT: Value: 0x0
> +// CHECK-NEXT: Value: 0x2048
> // CHECK-NEXT: Size:
> // CHECK-NEXT: Binding: Local
> // CHECK-NEXT: Type: None
> Index: ELF/Writer.cpp
> ===================================================================
> --- ELF/Writer.cpp
> +++ ELF/Writer.cpp
> @@ -827,7 +827,8 @@
> // an undefined symbol in the .o files.
> // Given that the symbol is effectively unused, we just create a dummy
> // hidden one to avoid the undefined symbol error.
> - Symtab<ELFT>::X->addIgnored("_GLOBAL_OFFSET_TABLE_");
> + ElfSym::GlobalOffsetTable =
> + Symtab<ELFT>::X->addIgnored("_GLOBAL_OFFSET_TABLE_");
>
> // __tls_get_addr is defined by the dynamic linker for dynamic ELFs. For
> // static linking the linker is required to optimize away any references to
> @@ -1751,6 +1752,9 @@
> if (ElfSym::Bss)
> ElfSym::Bss->Section = findSectionInScript(".bss");
>
> + if (ElfSym::GlobalOffsetTable && InX::Got)
> + ElfSym::GlobalOffsetTable->Value = InX::Got->getVA();
> +
> // Setup MIPS _gp_disp/__gnu_local_gp symbols which should
> // be equal to the _gp symbol's value.
> if (Config->EMachine == EM_MIPS && !ElfSym::MipsGp->Value) {
> Index: ELF/Symbols.h
> ===================================================================
> --- ELF/Symbols.h
> +++ ELF/Symbols.h
> @@ -317,6 +317,9 @@
> static DefinedRegular *End1;
> static DefinedRegular *End2;
>
> + // _GLOBAL_OFFSET_TABLE_
> + static DefinedRegular *GlobalOffsetTable;
> +
> // _gp, _gp_disp and __gnu_local_gp symbols. Only for MIPS.
> static DefinedRegular *MipsGp;
> static DefinedRegular *MipsGpDisp;
> Index: ELF/Symbols.cpp
> ===================================================================
> --- ELF/Symbols.cpp
> +++ ELF/Symbols.cpp
> @@ -35,6 +35,7 @@
> DefinedRegular *ElfSym::Edata2;
> DefinedRegular *ElfSym::End1;
> DefinedRegular *ElfSym::End2;
> +DefinedRegular *ElfSym::GlobalOffsetTable;
> DefinedRegular *ElfSym::MipsGp;
> DefinedRegular *ElfSym::MipsGpDisp;
> DefinedRegular *ElfSym::MipsLocalGp;
> Index: ELF/Relocations.cpp
> ===================================================================
> --- ELF/Relocations.cpp
> +++ ELF/Relocations.cpp
> @@ -399,6 +399,11 @@
> if (Body.isUndefined() && !Body.isLocal() && Body.symbol()->isWeak())
> return true;
>
> + // Relative relocation against the beginning of .got can always be computed
> + // at link-time as each ELF module has its own .got section.
> + if (&Body == ElfSym::GlobalOffsetTable)
> + return true;
> +
> error("relocation " + toString(Type) + " cannot refer to absolute symbol: " +
> toString(Body) + getLocation<ELFT>(S, Body, RelOff));
> return true;
More information about the llvm-commits
mailing list