llvm-6502/test/MC/ELF/relocation-386.s
Rafael Espindola 7486d92a6c Change how we iterate over relocations on ELF.
For COFF and MachO, sections semantically have relocations that apply to them.
That is not the case on ELF.

In relocatable objects (.o), a section with relocations in ELF has offsets to
another section where the relocations should be applied.

In dynamic objects and executables, relocations don't have an offset, they have
a virtual address. The section sh_info may or may not point to another section,
but that is not actually used for resolving the relocations.

This patch exposes that in the ObjectFile API. It has the following advantages:

* Most (all?) clients can handle this more efficiently. They will normally walk
all relocations, so doing an effort to iterate in a particular order doesn't
save time.

* llvm-readobj now prints relocations in the same way the native readelf does.

* probably most important, relocations that don't point to any section are now
visible. This is the case of relocations in the rela.dyn section. See the
updated relocation-executable.test for example.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182908 91177308-0d34-0410-b5e6-96231b3b80d8
2013-05-30 03:05:14 +00:00

131 lines
5.1 KiB
ArmAsm

// RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -o - | llvm-readobj -r -t | FileCheck %s
// Test that we produce the correct relocation types and that the relocations
// correctly point to the section or the symbol.
// CHECK: Relocations [
// CHECK-NEXT: Section (2) .rel.text {
// CHECK-NEXT: 0x2 R_386_GOTOFF .Lfoo 0x0
// CHECK-NEXT: 0x{{[^ ]+}} R_386_PLT32 bar2 0x0
// CHECK-NEXT: 0x{{[^ ]+}} R_386_GOTPC _GLOBAL_OFFSET_TABLE_ 0x0
// Relocation 3 (bar3@GOTOFF) is done with symbol 7 (bss)
// CHECK-NEXT: 0x{{[^ ]+}} R_386_GOTOFF .bss 0x0
// Relocation 4 (bar2@GOT) is of type R_386_GOT32
// CHECK-NEXT: 0x{{[^ ]+}} R_386_GOT32 bar2j 0x0
// Relocation 5 (foo@TLSGD) is of type R_386_TLS_GD
// CHECK-NEXT: 0x20 R_386_TLS_GD foo 0x0
// Relocation 6 ($foo@TPOFF) is of type R_386_TLS_LE_32
// CHECK-NEXT: 0x25 R_386_TLS_LE_32 foo 0x0
// Relocation 7 (foo@INDNTPOFF) is of type R_386_TLS_IE
// CHECK-NEXT: 0x2B R_386_TLS_IE foo 0x0
// Relocation 8 (foo@NTPOFF) is of type R_386_TLS_LE
// CHECK-NEXT: 0x31 R_386_TLS_LE foo 0x0
// Relocation 9 (foo@GOTNTPOFF) is of type R_386_TLS_GOTIE
// CHECK-NEXT: 0x37 R_386_TLS_GOTIE foo 0x0
// Relocation 10 (foo@TLSLDM) is of type R_386_TLS_LDM
// CHECK-NEXT: 0x3D R_386_TLS_LDM foo 0x0
// Relocation 11 (foo@DTPOFF) is of type R_386_TLS_LDO_32
// CHECK-NEXT: 0x43 R_386_TLS_LDO_32 foo 0x0
// Relocation 12 (calll 4096) is of type R_386_PC32
// CHECK-NEXT: 0x48 R_386_PC32 - 0x0
// Relocation 13 (zed@GOT) is of type R_386_GOT32 and uses the symbol
// CHECK-NEXT: 0x4E R_386_GOT32 zed 0x0
// Relocation 14 (zed@GOTOFF) is of type R_386_GOTOFF and uses the symbol
// CHECK-NEXT: 0x54 R_386_GOTOFF zed 0x0
// Relocation 15 (zed@INDNTPOFF) is of type R_386_TLS_IE and uses the symbol
// CHECK-NEXT: 0x5A R_386_TLS_IE zed 0x0
// Relocation 16 (zed@NTPOFF) is of type R_386_TLS_LE and uses the symbol
// CHECK-NEXT: 0x60 R_386_TLS_LE zed 0x0
// Relocation 17 (zed@GOTNTPOFF) is of type R_386_TLS_GOTIE and uses the symbol
// CHECK-NEXT: 0x66 R_386_TLS_GOTIE zed 0x0
// Relocation 18 (zed@PLT) is of type R_386_PLT32 and uses the symbol
// CHECK-NEXT: 0x6B R_386_PLT32 zed 0x0
// Relocation 19 (zed@TLSGD) is of type R_386_TLS_GD and uses the symbol
// CHECK-NEXT: 0x71 R_386_TLS_GD zed 0x0
// Relocation 20 (zed@TLSLDM) is of type R_386_TLS_LDM and uses the symbol
// CHECK-NEXT: 0x77 R_386_TLS_LDM zed 0x0
// Relocation 21 (zed@TPOFF) is of type R_386_TLS_LE_32 and uses the symbol
// CHECK-NEXT: 0x7D R_386_TLS_LE_32 zed 0x0
// Relocation 22 (zed@DTPOFF) is of type R_386_TLS_LDO_32 and uses the symbol
// CHECK-NEXT: 0x83 R_386_TLS_LDO_32 zed 0x0
// Relocation 23 ($bar) is of type R_386_32 and uses the section
// CHECK-NEXT: 0x{{[^ ]+}} R_386_32 .text 0x0
// Relocation 24 (foo@GOTTPOFF(%edx)) is of type R_386_TLS_IE_32 and uses the
// symbol
// CHECK-NEXT: 0x8E R_386_TLS_IE_32 foo 0x0
// Relocation 25 (_GLOBAL_OFFSET_TABLE_-bar2) is of type R_386_GOTPC.
// CHECK-NEXT: 0x94 R_386_GOTPC _GLOBAL_OFFSET_TABLE_ 0x0
// Relocation 26 (und_symbol-bar2) is of type R_386_PC32
// CHECK-NEXT: 0x9A R_386_PC32 und_symbol 0x0
// CHECK-NEXT: }
// CHECK-NEXT: ]
// Symbol 4 is zed
// CHECK: Symbol {
// CHECK: Name: zed (53)
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: TLS
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: zedsec (0x5)
// CHECK-NEXT: }
// Symbol 7 is section 4
// CHECK: Symbol {
// CHECK: Name: .bss (0)
// CHECK-NEXT: Value: 0x0
// CHECK-NEXT: Size: 0
// CHECK-NEXT: Binding: Local
// CHECK-NEXT: Type: Section
// CHECK-NEXT: Other: 0
// CHECK-NEXT: Section: .bss (0x4)
// CHECK-NEXT: }
.text
bar:
leal .Lfoo@GOTOFF(%ebx), %eax
.global bar2
bar2:
calll bar2@PLT
addl $_GLOBAL_OFFSET_TABLE_, %ebx
movb bar3@GOTOFF(%ebx), %al
.type bar3,@object
.local bar3
.comm bar3,1,1
movl bar2j@GOT(%eax), %eax
leal foo@TLSGD(, %ebx,1), %eax
movl $foo@TPOFF, %edx
movl foo@INDNTPOFF, %ecx
addl foo@NTPOFF(%eax), %eax
addl foo@GOTNTPOFF(%ebx), %ecx
leal foo@TLSLDM(%ebx), %eax
leal foo@DTPOFF(%eax), %edx
calll 4096
movl zed@GOT(%eax), %eax
movl zed@GOTOFF(%eax), %eax
movl zed@INDNTPOFF(%eax), %eax
movl zed@NTPOFF(%eax), %eax
movl zed@GOTNTPOFF(%eax), %eax
call zed@PLT
movl zed@TLSGD(%eax), %eax
movl zed@TLSLDM(%eax), %eax
movl zed@TPOFF(%eax), %eax
movl zed@DTPOFF(%eax), %eax
pushl $bar
addl foo@GOTTPOFF(%edx), %eax
subl _GLOBAL_OFFSET_TABLE_-bar2, %ebx
leal und_symbol-bar2(%edx),%ecx
.section zedsec,"awT",@progbits
zed:
.long 0
.section .rodata.str1.16,"aMS",@progbits,1
.Lfoo:
.asciz "bool llvm::llvm_start_multithreaded()"