Skip to content

Instantly share code, notes, and snippets.

@kikairoya
Created July 27, 2025 13:55
Show Gist options
  • Save kikairoya/229ec2ff83637f6742e6c0da07749bb3 to your computer and use it in GitHub Desktop.
Save kikairoya/229ec2ff83637f6742e6c0da07749bb3 to your computer and use it in GitHub Desktop.
// RUN: rm -rf %t && split-file %s %t
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/lib.s -o %t/lib.o
// RUN: ld.bfd -m i386pep %t/lib.o --dll -o %t/lib.dll --out-implib %t/lib.dll.a @%t/wrap.rsp --entry _dllmain --export-all-symbols
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/main.s -o %t/main.o
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/table.s -o %t/table.o
// RUN: llvm-mc -filetype=obj -triple=x86_64-w64-mingw32 %t/override.s -o %t/override.o
// RUN: ld.bfd -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll.a -o %t/bfd_imp.exe @%t/wrap.rsp
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/bfd_imp.exe | FileCheck %s
// RUN: %t/bfd_imp.exe
// RUN: ld.bfd -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll -o %t/bfd_dll.exe @%t/wrap.rsp
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/bfd_dll.exe | FileCheck %s
// RUN: %t/bfd_dll.exe
// RUN: ld.lld -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll.a -o %t/lld_imp.exe @%t/wrap.rsp --verbose
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/lld_imp.exe | FileCheck %s
// RUN: %t/lld_imp.exe
// RUN: ld.lld -m i386pep %t/main.o %t/table.o %t/override.o %t/lib.dll -o %t/lld_dll.exe @%t/wrap.rsp --verbose
// RUN: llvm-readobj --coff-imports --coff-basereloc %t/lld_dll.exe | FileCheck %s
// RUN: %t/lld_dll.exe
// CHECK: Import
// CHECK-NEXT: Name: lib.dll
// CHECK-NEXT: ImportLookupTableRVA
// CHECK-NEXT: ImportAddressTableRVA
// CHECK-NEXT: Symbol: strong_real
// CHECK-NEXT: Symbol: strong_wrap
// CHECK-NEXT: }
// CHECK: BaseReloc
// CHECK-NOT: 0x1100
// CHECK-NOT: 0x1110
// CHECK-NOT: 0x1120
// CHECK-NOT: 0x1130
// CHECK: ]
//--- wrap.rsp
--entry _start
--image-base 0x200000
--dynamicbase
--wrap weak_wrap
--wrap strong_wrap
--wrap undef_wrap
--wrap weak_hide
--wrap strong_hide
--wrap unused
--wrap alone
//--- main.s
.text
.globl _start
.align 16
_start:
movq ref_weak_wrap(%rip), %rcx
movq ref_weak_real(%rip), %rdx
add %rcx, %rdx
movq ref_undef_wrap(%rip), %rcx
movq ref_undef_real(%rip), %rax
add %rcx, %rdx
add %rax, %rdx
setne %dl // ret = (ref_weak_wrap + ...) != 0
xor %rcx, %rcx
dec %rcx
mov %rcx, %r10
mov $0x2C, %eax
syscall // ExitProcess(-1, ret)
jmp .
.globl _pei386_runtime_relocator
.align 16
_pei386_runtime_relocator:
ret
//--- table.s
.text
.align 256
.globl ref_weak_wrap
ref_weak_wrap:
.quad __real_weak_wrap
.weak __real_weak_wrap
.globl ref_strong_wrap
ref_strong_wrap:
.quad __real_strong_wrap
.globl ref_undef_wrap
ref_undef_wrap:
.quad __real_undef_wrap
.weak __real_undef_wrap
.globl ref_weak_hide
ref_weak_hide:
.quad __real_weak_hide
.weak __real_weak_hide
.globl ref_weak_real
ref_weak_real:
.quad weak_real
.weak weak_real
.globl ref_strong_real
ref_strong_real:
.quad strong_real
.globl ref_undef_real
ref_undef_real:
.quad undef_real
.weak undef_real
.globl ref_strong_hide
ref_strong_hide:
.quad __real_strong_hide
//--- override.s
.globl weak_hide
.align 16
weak_hide:
ret
.globl strong_hide
.align 16
strong_hide:
ret
.globl alone
.align 16
alone:
ret
//--- lib.s
.globl _dllmain
_dllmain:
xor %rax, %rax
inc %rax
ret
.globl weak_wrap
weak_wrap:
ret
.globl strong_wrap
strong_wrap:
ret
.globl weak_real
weak_real:
ret
.globl strong_real
strong_real:
ret
.globl weak_hide
weak_hide:
ret
.globl strong_hide
strong_hide:
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment