mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 16:26:42 +00:00

When then linker creates runtime pseudo relocations, it places them in a list with the assumption that the runtime will fix these relocations later, when the image gets loaded. If the relevant runtime function doesn't seem to be present in the linked image, error out. Normally when linking the mingw-w64 runtime libraries, this function always is available. However, if linking without including the mingw-w64 CRT startup files, and the image needs runtime pseudo relocations, make it clear that this won't work as expected at runtime. With ld.bfd, this situation is a hard error too; ld.bfd adds an undefined reference to this symbol if runtime pseudo relocations are needed. A later alternative would be to actually try to pull in the symbol (if seen in a static library, but not included yet). This would allow decoupling the function from the main mingw-w64 CRT startup code (making it optional, only running if the linker actually produced runtime pseudo relocations). Doing that would require restructuring the lld code (gathering pseudo relocations earlier, then loading the relocator function, then pulling in more object files to satisfy the dependencies of the relocator) though. Also, ld.bfd doesn't currently successfully pull in more object files to satisfy the dependency on _pei386_runtime_relocator, so with that in mind, there's not much extra value in making LLD do it currently either; we can't make such a change in mingw-w64's CRT until both linkers handle it. This fixes one issue brought up in https://github.com/llvm/llvm-project/issues/84424.
35 lines
1.1 KiB
ArmAsm
35 lines
1.1 KiB
ArmAsm
# REQUIRES: x86
|
|
|
|
# RUN: llvm-mc -triple=x86_64-windows-gnu %p/Inputs/gnu-implib-head.s -filetype=obj -o %t-dabcdh.o
|
|
# RUN: llvm-mc -triple=x86_64-windows-gnu %p/Inputs/gnu-implib-data.s -filetype=obj -o %t-dabcds00000.o
|
|
# RUN: llvm-mc -triple=x86_64-windows-gnu %p/Inputs/gnu-implib-tail.s -filetype=obj -o %t-dabcdt.o
|
|
# RUN: rm -f %t-implib.a
|
|
# RUN: llvm-ar rcs %t-implib.a %t-dabcdh.o %t-dabcds00000.o %t-dabcdt.o
|
|
|
|
# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj
|
|
# RUN: lld-link -lldmingw -debug:symtab -out:%t.exe -entry:main %t.obj %t-implib.a -verbose
|
|
|
|
# RUN: llvm-readobj --coff-imports %t.exe | FileCheck -check-prefix=IMPORTS %s
|
|
# RUN: llvm-nm %t.exe | FileCheck -check-prefix=SYMBOLS %s
|
|
|
|
# IMPORTS: Import {
|
|
# IMPORTS-NEXT: Name: foo.dll
|
|
# IMPORTS-NEXT: ImportLookupTableRVA:
|
|
# IMPORTS-NEXT: ImportAddressTableRVA:
|
|
# IMPORTS-NEXT: Symbol: data (0)
|
|
# IMPORTS-NEXT: }
|
|
|
|
# Check that the automatically imported symbol "data" is not listed in
|
|
# the symbol table.
|
|
# SYMBOLS-NOT: {{ }}data
|
|
|
|
.global main
|
|
.text
|
|
main:
|
|
movl data(%rip), %eax
|
|
ret
|
|
.global _pei386_runtime_relocator
|
|
_pei386_runtime_relocator:
|
|
ret
|
|
.data
|