mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-14 03:29:57 +00:00
7a41693898
MinGW uses these kind of list terminator symbols for traversing the constructor/destructor lists. These list terminators are actual pointers entries in the lists, with the values 0 and (uintptr_t)-1 (instead of just symbols pointing to the start/end of the list). (This mechanism exists in both the mingw-w64 crt startup code and in libgcc; normally the mingw-w64 one is used, but a DLL build of libgcc uses the libgcc one. Therefore it's not trivial to change the mechanism without lots of cross-project synchronization and potentially invalidating some combinations of old/new versions of them.) When mingw-w64 has been used with lld so far, the CRT startup object files have so far provided these symbols, ending up with different, incompatible builds of the CRT startup object files depending on whether binutils or lld are going to be used. In order to avoid the need of different configuration of the CRT startup object files depending on what linker to be used, provide these symbols in lld instead. (Mingw-w64 checks at build time whether the linker provides these symbols or not.) This unifies this particular detail between the two linkers. This does disallow the use of the very latest lld with older versions of mingw-w64 (the configure check for the list was added recently; earlier it simply checked whether the CRT was built with gcc or clang), and requires rebuilding the mingw-w64 CRT. But the number of users of lld+mingw still is low enough that such a change should be tolerable, and unifies this aspect of the toolchains, easing interoperability between the toolchains for the future. The actual test for this feature is added in ctors_dtors_priority.s, but a number of other tests that checked absolute output addresses are updated. Differential Revision: https://reviews.llvm.org/D52053 llvm-svn: 342294
54 lines
2.0 KiB
ArmAsm
54 lines
2.0 KiB
ArmAsm
# REQUIRES: x86
|
|
|
|
# RUN: echo -e ".global variable\n.global DllMainCRTStartup\n.text\nDllMainCRTStartup:\nret\n.data\nvariable:\n.long 42" > %t-lib.s
|
|
# RUN: llvm-mc -triple=x86_64-windows-gnu %t-lib.s -filetype=obj -o %t-lib.obj
|
|
# RUN: lld-link -out:%t-lib.dll -dll -entry:DllMainCRTStartup %t-lib.obj -lldmingw -implib:%t-lib.lib
|
|
|
|
# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj
|
|
# RUN: lld-link -lldmingw -out:%t.exe -entry:main %t.obj %t-lib.lib -verbose
|
|
|
|
# RUN: llvm-readobj -coff-imports %t.exe | FileCheck -check-prefix=IMPORTS %s
|
|
# RUN: llvm-objdump -d %t.exe | FileCheck -check-prefix=DISASM %s
|
|
# RUN: llvm-objdump -s %t.exe | FileCheck -check-prefix=CONTENTS %s
|
|
|
|
# IMPORTS: Import {
|
|
# IMPORTS-NEXT: Name: autoimport-x86.s.tmp-lib.dll
|
|
# IMPORTS-NEXT: ImportLookupTableRVA: 0x2070
|
|
# IMPORTS-NEXT: ImportAddressTableRVA: 0x2080
|
|
# IMPORTS-NEXT: Symbol: variable (0)
|
|
# IMPORTS-NEXT: }
|
|
|
|
# DISASM: Disassembly of section .text:
|
|
# DISASM: .text:
|
|
# Relative offset at 0x1002 pointing at the IAT at 0x2080.
|
|
# DISASM: 140001000: 8b 05 7a 10 00 00 movl 4218(%rip), %eax
|
|
# DISASM: 140001006: c3 retq
|
|
|
|
# Runtime pseudo reloc list header consisting of 0x0, 0x0, 0x1.
|
|
# First runtime pseudo reloc, with import from 0x2080,
|
|
# applied at 0x1002, with a size of 32 bits.
|
|
# Second runtime pseudo reloc, with import from 0x2080,
|
|
# applied at 0x3000, with a size of 64 bits.
|
|
# CONTENTS: Contents of section .rdata:
|
|
# CONTENTS: 140002000 00000000 00000000 01000000 80200000
|
|
# CONTENTS: 140002010 02100000 20000000 80200000 00300000
|
|
# CONTENTS: 140002020 40000000
|
|
# ptr: pointing at the IAT RVA at 0x2080
|
|
# relocs: pointing at the runtime pseudo reloc list at
|
|
# 0x2000 - 0x2024.
|
|
# CONTENTS: Contents of section .data:
|
|
# CONTENTS: 140003000 80200040 01000000 00200040 01000000
|
|
# CONTENTS: 140003010 24200040 01000000
|
|
|
|
.global main
|
|
.text
|
|
main:
|
|
movl variable(%rip), %eax
|
|
ret
|
|
.data
|
|
ptr:
|
|
.quad variable
|
|
relocs:
|
|
.quad __RUNTIME_PSEUDO_RELOC_LIST__
|
|
.quad __RUNTIME_PSEUDO_RELOC_LIST_END__
|