summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_none.yaml1
-rw-r--r--llvm/test/Object/AMDGPU/elf64-relocs.yaml13
-rw-r--r--llvm/test/Object/Lanai/yaml2obj-elf-lanai-rel.yaml6
-rw-r--r--llvm/test/Object/X86/yaml-elf-x86-rel-broken.yaml3
-rw-r--r--llvm/test/Object/yaml2obj-elf-rel-noref.yaml1
-rw-r--r--llvm/test/tools/llvm-objdump/X86/disasm-zeroes-relocations.test3
-rw-r--r--llvm/test/tools/sanstats/elf.test17
-rw-r--r--llvm/test/tools/yaml2obj/relocation-explicit-symbol-index.yaml36
-rw-r--r--llvm/test/tools/yaml2obj/relocation-missing-symbol.yaml24
-rw-r--r--llvm/tools/yaml2obj/yaml2elf.cpp13
10 files changed, 74 insertions, 43 deletions
diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_none.yaml b/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_none.yaml
index 7732c7f1ab9..ed4b243fae1 100644
--- a/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_none.yaml
+++ b/llvm/test/ExecutionEngine/RuntimeDyld/X86/ELF_x86-64_none.yaml
@@ -20,7 +20,6 @@ Sections:
Info: .text
Relocations:
- Offset: 0x0000000000000000
- Symbol: ''
Type: R_X86_64_NONE
Symbols:
Global:
diff --git a/llvm/test/Object/AMDGPU/elf64-relocs.yaml b/llvm/test/Object/AMDGPU/elf64-relocs.yaml
index bc6c2b89d5f..d2c45e447ff 100644
--- a/llvm/test/Object/AMDGPU/elf64-relocs.yaml
+++ b/llvm/test/Object/AMDGPU/elf64-relocs.yaml
@@ -38,43 +38,30 @@ Sections:
AddressAlign: 0x08
Relocations:
- Offset: 0x0
- Symbol: s0
Type: R_AMDGPU_NONE
- Offset: 0x2
- Symbol: s1
Type: R_AMDGPU_ABS32_LO
- Offset: 0x4
- Symbol: s2
Type: R_AMDGPU_ABS32_HI
- Offset: 0x6
- Symbol: s3
Type: R_AMDGPU_ABS64
- Offset: 0x8
- Symbol: s4
Type: R_AMDGPU_REL32
- Offset: 0x10
- Symbol: s5
Type: R_AMDGPU_REL64
- Offset: 0x12
- Symbol: s6
Type: R_AMDGPU_ABS32
- Offset: 0x14
- Symbol: s7
Type: R_AMDGPU_GOTPCREL
- Offset: 0x16
- Symbol: s8
Type: R_AMDGPU_GOTPCREL32_LO
- Offset: 0x18
- Symbol: s9
Type: R_AMDGPU_GOTPCREL32_HI
- Offset: 0x20
- Symbol: s10
Type: R_AMDGPU_REL32_LO
- Offset: 0x22
- Symbol: s11
Type: R_AMDGPU_REL32_HI
- Offset: 0x24
- Symbol: s12
Type: R_AMDGPU_RELATIVE64
Symbols:
diff --git a/llvm/test/Object/Lanai/yaml2obj-elf-lanai-rel.yaml b/llvm/test/Object/Lanai/yaml2obj-elf-lanai-rel.yaml
index df81a5b8bde..ec2a19d741d 100644
--- a/llvm/test/Object/Lanai/yaml2obj-elf-lanai-rel.yaml
+++ b/llvm/test/Object/Lanai/yaml2obj-elf-lanai-rel.yaml
@@ -35,22 +35,16 @@ Sections:
Symbol: main
Type: R_LANAI_32
- Offset: 0x4
- Symbol: a
Type: R_LANAI_NONE
- Offset: 0x8
- Symbol: b
Type: R_LANAI_21
- Offset: 0xC
- Symbol: c
Type: R_LANAI_21_F
- Offset: 0x10
- Symbol: d
Type: R_LANAI_25
- Offset: 0x14
- Symbol: e
Type: R_LANAI_HI16
- Offset: 0x18
- Symbol: f
Type: R_LANAI_LO16
diff --git a/llvm/test/Object/X86/yaml-elf-x86-rel-broken.yaml b/llvm/test/Object/X86/yaml-elf-x86-rel-broken.yaml
index edd5dbce123..b9afd768e0b 100644
--- a/llvm/test/Object/X86/yaml-elf-x86-rel-broken.yaml
+++ b/llvm/test/Object/X86/yaml-elf-x86-rel-broken.yaml
@@ -27,3 +27,6 @@ Sections:
- Offset: 0
Symbol: main
Type: 0xFF
+Symbols:
+ Global:
+ - Name: main
diff --git a/llvm/test/Object/yaml2obj-elf-rel-noref.yaml b/llvm/test/Object/yaml2obj-elf-rel-noref.yaml
index 8eb6b0dca3b..cf4324b67de 100644
--- a/llvm/test/Object/yaml2obj-elf-rel-noref.yaml
+++ b/llvm/test/Object/yaml2obj-elf-rel-noref.yaml
@@ -21,7 +21,6 @@ Sections:
Info: .text
Relocations:
- Offset: 0x000000000000000C
- Symbol: ''
Type: R_ARM_V4BX
- Name: .data
Type: SHT_PROGBITS
diff --git a/llvm/test/tools/llvm-objdump/X86/disasm-zeroes-relocations.test b/llvm/test/tools/llvm-objdump/X86/disasm-zeroes-relocations.test
index 7bdc7fd7f34..ad8b025ab50 100644
--- a/llvm/test/tools/llvm-objdump/X86/disasm-zeroes-relocations.test
+++ b/llvm/test/tools/llvm-objdump/X86/disasm-zeroes-relocations.test
@@ -50,3 +50,6 @@ Sections:
- Offset: 0x0000000000000008
Symbol: x
Type: R_X86_64_64
+Symbols:
+ Global:
+ - Name: x
diff --git a/llvm/test/tools/sanstats/elf.test b/llvm/test/tools/sanstats/elf.test
index 54878a1d526..67e6e4ae1c1 100644
--- a/llvm/test/tools/sanstats/elf.test
+++ b/llvm/test/tools/sanstats/elf.test
@@ -85,46 +85,34 @@ Sections:
Info: .debug_info
Relocations:
- Offset: 0x0000000000000006
- Symbol: ''
Type: R_X86_64_32
- Offset: 0x000000000000000C
- Symbol: ''
Type: R_X86_64_32
- Offset: 0x0000000000000012
- Symbol: ''
Type: R_X86_64_32
Addend: 55
- Offset: 0x0000000000000016
- Symbol: ''
Type: R_X86_64_32
- Offset: 0x000000000000001A
- Symbol: ''
Type: R_X86_64_32
Addend: 59
- Offset: 0x000000000000001E
- Symbol: ''
Type: R_X86_64_64
- Offset: 0x000000000000002B
- Symbol: ''
Type: R_X86_64_64
- Offset: 0x0000000000000039
- Symbol: ''
Type: R_X86_64_32
Addend: 64
- Offset: 0x0000000000000040
- Symbol: ''
Type: R_X86_64_64
Addend: 16
- Offset: 0x000000000000004E
- Symbol: ''
Type: R_X86_64_32
Addend: 67
- Offset: 0x0000000000000055
- Symbol: ''
Type: R_X86_64_64
Addend: 32
- Offset: 0x0000000000000063
- Symbol: ''
Type: R_X86_64_32
Addend: 70
- Name: .debug_ranges
@@ -142,7 +130,6 @@ Sections:
Info: .debug_pubnames
Relocations:
- Offset: 0x0000000000000006
- Symbol: ''
Type: R_X86_64_32
- Name: .comment
Type: SHT_PROGBITS
@@ -165,14 +152,11 @@ Sections:
Info: .eh_frame
Relocations:
- Offset: 0x0000000000000020
- Symbol: ''
Type: R_X86_64_PC32
- Offset: 0x000000000000003C
- Symbol: ''
Type: R_X86_64_PC32
Addend: 16
- Offset: 0x0000000000000058
- Symbol: ''
Type: R_X86_64_PC32
Addend: 32
- Name: .debug_line
@@ -186,7 +170,6 @@ Sections:
Info: .debug_line
Relocations:
- Offset: 0x0000000000000027
- Symbol: ''
Type: R_X86_64_64
Symbols:
Local:
diff --git a/llvm/test/tools/yaml2obj/relocation-explicit-symbol-index.yaml b/llvm/test/tools/yaml2obj/relocation-explicit-symbol-index.yaml
new file mode 100644
index 00000000000..ac16643b9b0
--- /dev/null
+++ b/llvm/test/tools/yaml2obj/relocation-explicit-symbol-index.yaml
@@ -0,0 +1,36 @@
+# Test that a relocation's symbol can be an integer.
+# RUN: yaml2obj %s > %t
+# LLVM tools (both llvm-readobj and llvm-objdump) reject relocations with
+# invalid symbol indexes, so inspect the hex contents instead.
+# RUN: llvm-readobj -x .rela.text %t | FileCheck %s
+
+# CHECK: Hex dump of section '.rela.text':
+# CHECK-NEXT: 0x00000000 00000000 00000000 02000000 42000000
+# Symbol index 0x42 --^
+# CHECK-NEXT: 0x00000010 00000000 00000000 00000000 00000000
+# CHECK-NEXT: 0x00000020 02000000 01000000 00000000 00000000
+# Symbol index 0x01 --^
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ - Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ Link: .symtab
+ Relocations:
+ - Type: R_X86_64_PC32
+ Offset: 0
+ Symbol: 0x42
+ - Type: R_X86_64_PC32
+ Offset: 0
+ Symbol: 0x1
+Symbols:
+ Global:
+ - Name: foo
diff --git a/llvm/test/tools/yaml2obj/relocation-missing-symbol.yaml b/llvm/test/tools/yaml2obj/relocation-missing-symbol.yaml
new file mode 100644
index 00000000000..7edbf188a21
--- /dev/null
+++ b/llvm/test/tools/yaml2obj/relocation-missing-symbol.yaml
@@ -0,0 +1,24 @@
+# Show that yaml2obj rejects a symbol reference from a relocation if the symbol
+# does not exist.
+
+# RUN: not yaml2obj %s -o %t 2>&1 | FileCheck %s
+
+# CHECK: Unknown symbol referenced: 'does_not_exist' at YAML section '.rela.text'
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ - Name: .rela.text
+ Type: SHT_RELA
+ Info: .text
+ Link: .symtab
+ Relocations:
+ - Type: R_X86_64_PC32
+ Offset: 0
+ Symbol: does_not_exist
diff --git a/llvm/tools/yaml2obj/yaml2elf.cpp b/llvm/tools/yaml2obj/yaml2elf.cpp
index 6bae48bba40..df4bdb7d2dd 100644
--- a/llvm/tools/yaml2obj/yaml2elf.cpp
+++ b/llvm/tools/yaml2obj/yaml2elf.cpp
@@ -530,11 +530,14 @@ ELFState<ELFT>::writeSectionContent(Elf_Shdr &SHeader,
for (const auto &Rel : Section.Relocations) {
unsigned SymIdx = 0;
- // Some special relocation, R_ARM_v4BX for instance, does not have
- // an external reference. So it ignores the return value of lookup()
- // here.
- if (Rel.Symbol)
- SymN2I.lookup(*Rel.Symbol, SymIdx);
+ // If a relocation references a symbol, try to look one up in the symbol
+ // table. If it is not there, treat the value as a symbol index.
+ if (Rel.Symbol && SymN2I.lookup(*Rel.Symbol, SymIdx) &&
+ !to_integer(*Rel.Symbol, SymIdx)) {
+ WithColor::error() << "Unknown symbol referenced: '" << *Rel.Symbol
+ << "' at YAML section '" << Section.Name << "'.\n";
+ return false;
+ }
if (IsRela) {
Elf_Rela REntry;
OpenPOWER on IntegriCloud