llvm/lld/test/ELF/relocatable.s

# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/relocatable.s -o %t2.o
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/relocatable2.s -o %t3.o
# RUN: ld.lld -r %t1.o %t2.o %t3.o -o %t
# RUN: llvm-readobj --file-headers --sections -l --symbols -r %t | FileCheck %s
# RUN: llvm-objdump --section-headers %t | FileCheck --check-prefix=SECTION %s
# RUN: llvm-objdump --no-print-imm-hex -s -d %t | FileCheck --check-prefix=CHECKTEXT %s

## Test --relocatable alias
# RUN: ld.lld --relocatable %t1.o %t2.o %t3.o -o %t
# RUN: llvm-readobj --file-headers --sections -l --symbols -r %t | FileCheck %s
# RUN: llvm-objdump --no-print-imm-hex -s -d %t | FileCheck --check-prefix=CHECKTEXT %s

## Verify that we can use our relocation output as input to produce executable
# RUN: ld.lld -e main %t -o %texec
# RUN: llvm-readobj --file-headers %texec | FileCheck -check-prefix=CHECKEXE %s

# CHECK:       ElfHeader {
# CHECK-NEXT:  Ident {
# CHECK-NEXT:    Magic: (7F 45 4C 46)
# CHECK-NEXT:    Class: 64-bit
# CHECK-NEXT:    DataEncoding: LittleEndian
# CHECK-NEXT:    FileVersion: 1
# CHECK-NEXT:    OS/ABI: SystemV
# CHECK-NEXT:    ABIVersion: 0
# CHECK-NEXT:    Unused: (00 00 00 00 00 00 00)
# CHECK-NEXT:  }
# CHECK-NEXT:  Type: Relocatable
# CHECK-NEXT:  Machine: EM_X86_64
# CHECK-NEXT:  Version: 1
# CHECK-NEXT:  Entry: 0x0
# CHECK-NEXT:  ProgramHeaderOffset: 0x0
# CHECK-NEXT:  SectionHeaderOffset:
# CHECK-NEXT:  Flags [
# CHECK-NEXT:  ]
# CHECK-NEXT:  HeaderSize: 64
# CHECK-NEXT:  ProgramHeaderEntrySize: 0
# CHECK-NEXT:  ProgramHeaderCount: 0
# CHECK-NEXT:  SectionHeaderEntrySize: 64
# CHECK-NEXT:  SectionHeaderCount: 8
# CHECK-NEXT:  StringTableSectionIndex: 6
# CHECK-NEXT:  }

# CHECK:       Relocations [
# CHECK-NEXT:  Section ({{.*}}) .rela.text {
# CHECK-NEXT:    0x3 R_X86_64_32S x 0x0
# CHECK-NEXT:    0xE R_X86_64_32S y 0x0
# CHECK-NEXT:    0x23 R_X86_64_32S xx 0x0
# CHECK-NEXT:    0x2E R_X86_64_32S yy 0x0
# CHECK-NEXT:    0x43 R_X86_64_32S xxx 0x0
# CHECK-NEXT:    0x4E R_X86_64_32S yyy 0x0
# CHECK-NEXT:  }

# SECTION: Sections:
# SECTION: Idx Name          Size     VMA              Type
# SECTION:   0               00000000 0000000000000000
# SECTION:   1 .text         00000056 0000000000000000 TEXT
# SECTION:   2 .rela.text    00000090 0000000000000000
# SECTION:   3 .bss          00000018 0000000000000000 BSS
# SECTION:   4 .note.GNU-stack 00000000 0000000000000000
# SECTION:   5 .symtab       00000168 0000000000000000
# SECTION:   6 .shstrtab     00000041 0000000000000000
# SECTION:   7 .strtab       0000002d 0000000000000000

# CHECKTEXT:      Disassembly of section .text:
# CHECKTEXT-EMPTY:
# CHECKTEXT-NEXT: <main>:
# CHECKTEXT-NEXT: 0: c7 04 25 00 00 00 00 05 00 00 00 movl $5, 0
# CHECKTEXT-NEXT: b: c7 04 25 00 00 00 00 07 00 00 00 movl $7, 0
# CHECKTEXT:      <foo>:
# CHECKTEXT-NEXT: 20: c7 04 25 00 00 00 00 01 00 00 00 movl $1, 0
# CHECKTEXT-NEXT: 2b: c7 04 25 00 00 00 00 02 00 00 00 movl $2, 0
# CHECKTEXT:      <bar>:
# CHECKTEXT-NEXT: 40: c7 04 25 00 00 00 00 08 00 00 00 movl $8, 0
# CHECKTEXT-NEXT: 4b: c7 04 25 00 00 00 00 09 00 00 00 movl $9, 0

# CHECKEXE:       Format: elf64-x86-64
# CHECKEXE-NEXT:  Arch: x86_64
# CHECKEXE-NEXT:  AddressSize: 64bit
# CHECKEXE-NEXT:  LoadName:
# CHECKEXE-NEXT:  ElfHeader {
# CHECKEXE-NEXT:    Ident {
# CHECKEXE-NEXT:      Magic: (7F 45 4C 46)
# CHECKEXE-NEXT:      Class: 64-bit
# CHECKEXE-NEXT:      DataEncoding: LittleEndian
# CHECKEXE-NEXT:      FileVersion: 1
# CHECKEXE-NEXT:      OS/ABI: SystemV (0x0)
# CHECKEXE-NEXT:      ABIVersion: 0
# CHECKEXE-NEXT:      Unused: (00 00 00 00 00 00 00)
# CHECKEXE-NEXT:    }
# CHECKEXE-NEXT:    Type: Executable
# CHECKEXE-NEXT:    Machine: EM_X86_64
# CHECKEXE-NEXT:    Version: 1
# CHECKEXE-NEXT:    Entry: 0x201160
# CHECKEXE-NEXT:    ProgramHeaderOffset: 0x40
# CHECKEXE-NEXT:    SectionHeaderOffset: 0x358
# CHECKEXE-NEXT:    Flags [
# CHECKEXE-NEXT:    ]
# CHECKEXE-NEXT:    HeaderSize: 64
# CHECKEXE-NEXT:    ProgramHeaderEntrySize: 56
# CHECKEXE-NEXT:    ProgramHeaderCount: 5
# CHECKEXE-NEXT:    SectionHeaderEntrySize: 64
# CHECKEXE-NEXT:    SectionHeaderCount: 7
# CHECKEXE-NEXT:    StringTableSectionIndex: 5
# CHECKEXE-NEXT:  }

.text
.type x,@object
.bss
.globl x
.align 4
x:
.long 0
.size x, 4
.type y,@object
.globl y
.align 4
y:
.long 0
.size y, 4

.text
.globl main
.align 16, 0x90
.type main,@function
main:
movl $5, x
movl $7, y

blah:
goo:
abs = 42