mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
168234fec6
The code to detect the requirement for 64-bit offsets in the archive symbol table was not correctly accounting for the archive file signature and the size of all the contents of the symbol table itself, e.g. the symbol table's header and string table. Also was not considering the variation in symbol table formats. This could result in the creation of large archives with a corrupt symbol table. Change the testing environment variable SYM64_THRESHOLD to be an absolute value rather than a power of 2 in order to enable precise testing of this detection code. Differential Revision: https://reviews.llvm.org/D89891
227 lines
7.2 KiB
Plaintext
227 lines
7.2 KiB
Plaintext
# RUN: yaml2obj --docnum=1 %s -o %t.elf-x86-64
|
|
# RUN: yaml2obj --docnum=2 %s -o %t2.elf-x86-64
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
|
Symbols:
|
|
- Name: main
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
Binding: STB_GLOBAL
|
|
- Name: SomeOtherFunction
|
|
Binding: STB_GLOBAL
|
|
- Name: puts
|
|
Binding: STB_GLOBAL
|
|
|
|
--- !ELF
|
|
FileHeader:
|
|
Class: ELFCLASS64
|
|
Data: ELFDATA2LSB
|
|
Type: ET_REL
|
|
Machine: EM_X86_64
|
|
Sections:
|
|
- Name: .text
|
|
Type: SHT_PROGBITS
|
|
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
|
|
Symbols:
|
|
- Name: bar
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
- Name: foo
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
Binding: STB_GLOBAL
|
|
Value: 0x0000000000000006
|
|
- Name: main
|
|
Type: STT_FUNC
|
|
Section: .text
|
|
Binding: STB_GLOBAL
|
|
Value: 0x0000000000000016
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar rcsU %t.a %t.elf-x86-64 %t2.elf-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: env SYM64_THRESHOLD=836 llvm-ar rcsU %t.a %t.elf-x86-64 %t2.elf-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s
|
|
# RUN: grep '/SYM64/' %t.a
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: env SYM64_THRESHOLD=837 llvm-ar rcsU %t.a %t.elf-x86-64 %t2.elf-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s
|
|
# RUN: not grep '/SYM64/' %t.a
|
|
|
|
# CHECK: Archive map
|
|
# CHECK-NEXT: main in {{.*}}.elf-x86-64
|
|
# CHECK-NEXT: foo in {{.*}}2.elf-x86-64
|
|
# CHECK-NEXT: main in {{.*}}2.elf-x86-64
|
|
# CHECK-NOT: bar
|
|
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar --format=gnu rcT %t.a %t.elf-x86-64 %t2.elf-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck -DFILE=%/t.elf-x86-64 -DFILE2=%/t2.elf-x86-64 --check-prefix=THIN %s
|
|
|
|
# THIN: Archive map
|
|
# THIN-NEXT: main in [[FILE]]
|
|
# THIN-NEXT: foo in [[FILE2]]
|
|
# THIN-NEXT: main in [[FILE2]]
|
|
|
|
|
|
# CHECK: {{.*}}.elf-x86-64:
|
|
# CHECK-NEXT: U SomeOtherFunction
|
|
# CHECK-NEXT: 0000000000000000 T main
|
|
# CHECK-NEXT: U puts
|
|
|
|
# CHECK: {{.*}}2.elf-x86-64:
|
|
# CHECK-NEXT: 0000000000000000 t bar
|
|
# CHECK-NEXT: 0000000000000006 T foo
|
|
# CHECK-NEXT: 0000000000000016 T main
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar rcSU %t.a %t.elf-x86-64 %t2.elf-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s --check-prefix=NOMAP
|
|
|
|
# NOMAP-NOT: Archive map
|
|
|
|
# RUN: llvm-ar s %t.a
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s
|
|
|
|
## Check that the archive does have a corrupt symbol table.
|
|
# RUN: rm -f %t.a
|
|
# RUN: cp %p/Inputs/archive-test.a-corrupt-symbol-table %t.a
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s --check-prefix=CORRUPT
|
|
|
|
# CORRUPT: Archive map
|
|
# CORRUPT-NEXT: mbin in trivial-object-test.elf-x86-64
|
|
# CORRUPT-NEXT: foo in trivial-object-test2.elf-x86-64
|
|
# CORRUPT-NEXT: main in trivial-object-test2.elf-x86-64
|
|
|
|
# CORRUPT: {{.*}}.elf-x86-64:
|
|
# CORRUPT-NEXT: U SomeOtherFunction
|
|
# CORRUPT-NEXT: 0000000000000000 T main
|
|
# CORRUPT-NEXT: U puts
|
|
|
|
# CORRUPT: {{.*}}2.elf-x86-64:
|
|
# CORRUPT-NEXT: 0000000000000000 t bar
|
|
# CORRUPT-NEXT: 0000000000000006 T foo
|
|
# CORRUPT-NEXT: 0000000000000016 T main
|
|
|
|
## Check that the we *don't* update the symbol table.
|
|
# RUN: llvm-ar s %t.a
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s --check-prefix=CORRUPT
|
|
|
|
## Repeat the test with llvm-ranlib.
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar rcSU %t.a %t.elf-x86-64 %t2.elf-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s --check-prefix=NOMAP
|
|
|
|
# RUN: llvm-ranlib %t.a
|
|
# RUN: llvm-nm -M %t.a | FileCheck %s
|
|
|
|
# RUN: llvm-nm -M %p/Inputs/macho-archive-x86_64.a | FileCheck %s --check-prefix=BSD-MachO
|
|
# RUN: llvm-nm -M %p/Inputs/macho-archive-unsorted-x86_64.a | FileCheck %s --check-prefix=BSD-MachO
|
|
|
|
# BSD-MachO: Archive map
|
|
# BSD-MachO: _bar in bar.o
|
|
# BSD-MachO: _foo in foo.o
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar --format=bsd rcsU %t.a %p/Inputs/trivial-object-test.macho-x86-64 %p/Inputs/trivial-object-test2.macho-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck --check-prefix=MACHO %s
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: env SYM64_THRESHOLD=784 llvm-ar --format=darwin rcsU %t.a %p/Inputs/trivial-object-test.macho-x86-64 %p/Inputs/trivial-object-test2.macho-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck --check-prefix=MACHO %s
|
|
# RUN: grep '__\.SYMDEF_64' %t.a
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: env SYM64_THRESHOLD=785 llvm-ar --format=darwin rcsU %t.a %p/Inputs/trivial-object-test.macho-x86-64 %p/Inputs/trivial-object-test2.macho-x86-64
|
|
# RUN: llvm-nm -M %t.a | FileCheck --check-prefix=MACHO %s
|
|
# RUN: not grep '__\.SYMDEF_64' %t.a
|
|
|
|
# MACHO: Archive map
|
|
# MACHO-NEXT: _main in trivial-object-test.macho-x86-64
|
|
# MACHO-NEXT: _foo in trivial-object-test2.macho-x86-64
|
|
# MACHO-NEXT: _main in trivial-object-test2.macho-x86-64
|
|
# MACHO-NOT: {{^}}bar
|
|
|
|
# MACHO: trivial-object-test.macho-x86-64
|
|
# MACHO-NEXT: 0000000000000028 s L_.str
|
|
# MACHO-NEXT: U _SomeOtherFunction
|
|
# MACHO-NEXT: 0000000000000000 T _main
|
|
# MACHO-NEXT: U _puts
|
|
|
|
# MACHO: trivial-object-test2.macho-x86-64
|
|
# MACHO-NEXT: 0000000000000000 t _bar
|
|
# MACHO-NEXT: 0000000000000001 T _foo
|
|
# MACHO-NEXT: 0000000000000002 T _main
|
|
|
|
# RUN: llvm-nm -M %p/Inputs/macho-toc64-archive-x86_64.a | FileCheck --check-prefix=MACHO-TOC64 %s
|
|
|
|
# MACHO-TOC64: Archive map
|
|
# MACHO-TOC64-NEXT: _test in test.o
|
|
# MACHO-TOC64-NEXT: _test in xtest.o
|
|
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar --format=gnu rcsU %t.a %p/Inputs/coff-short-import-code %p/Inputs/coff-short-import-data
|
|
# RUN: llvm-nm -M %t.a | FileCheck --check-prefix=COFF-SHORT-IMPORT %s
|
|
|
|
# COFF-SHORT-IMPORT: Archive map
|
|
# COFF-SHORT-IMPORT-NEXT: __imp__foo in coff-short-import-code
|
|
# COFF-SHORT-IMPORT-NEXT: _foo in coff-short-import-code
|
|
# COFF-SHORT-IMPORT-NEXT: __imp__bar in coff-short-import-data
|
|
# COFF-SHORT-IMPORT-NOT: _bar in coff-short-import-data
|
|
|
|
## Test that we pad the symbol table so that it ends in a multiple of 8 bytes:
|
|
## 8 + 60 + 36 == 104
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar --format=bsd rcsU %t.a %p/Inputs/trivial-object-test.macho-x86-64
|
|
# RUN: FileCheck --check-prefix=MACHO-SYMTAB-ALIGN %s < %t.a
|
|
# MACHO-SYMTAB-ALIGN: !<arch>
|
|
# MACHO-SYMTAB-ALIGN-NEXT: #1/12 {{..........}} 0 0 0 36 `
|
|
|
|
## Test that we pad the symbol table so that it ends in a multiple of 8 bytes:
|
|
## 8 + 60 + 52 == 120
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar --format=bsd rcsD %t.a %p/Inputs/trivial-object-test.macho-x86-64 %p/Inputs/trivial-object-test.macho-x86-64
|
|
# RUN: FileCheck --check-prefix=MACHO-SYMTAB-ALIGN2 %s < %t.a
|
|
# MACHO-SYMTAB-ALIGN2: !<arch>
|
|
# MACHO-SYMTAB-ALIGN2-NEXT: #1/12 0 0 0 0 52 `
|
|
|
|
## With a gnu symbol table we only align to two
|
|
# 8 + 60 + 14 = 82
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar --format=gnu rcsD %t.a %p/Inputs/trivial-object-test.macho-x86-64
|
|
# RUN: FileCheck --check-prefix=GNU-SYMTAB-ALIGN %s < %t.a
|
|
# GNU-SYMTAB-ALIGN: !<arch>
|
|
# GNU-SYMTAB-ALIGN-NEXT: / 0 0 0 0 14 `
|
|
|
|
|
|
## ** Test the behavior of an empty archive:
|
|
|
|
## No symbol table emitted for GNU archives
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar rcs --format=gnu %t.a
|
|
# RUN: not grep -q '/ ' %t.a
|
|
|
|
## No symbol table for BSD archives
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar rcs --format=bsd %t.a
|
|
# RUN: not grep -q '__\.SYMDEF' %t.a
|
|
|
|
## And we do emit a symbol table for DARWIN archives
|
|
# RUN: rm -f %t.a
|
|
# RUN: llvm-ar rcs --format=darwin %t.a
|
|
# RUN: grep -q '__\.SYMDEF' %t.a
|