xxx.dll.a はインポートライブラリーです。
これをリンクすると xxx.dll を配布することになります。
しかし、意図的に xxx.a をスタティックリンクしたい場合があります。
xxx.dll を配布したくない場合など。
そこで xxx.notdll.a をリンクすることで、
xxx.dll → xxx.a へリダイレクションしたい。
具体的には:
; _deflate
extern _deflate
global __imp__deflate
__imp__deflate:
dd _deflate
__imp__deflate はポインターです。
_deflate のアドレスを設定するような .asm を書き、
.obj にコンパイルして、
.notdll.a ライブラリを作成する方法をとりました。
こちらの内容を自動化する、
xxx.dll.a から xxx.notdll.a を作出するスクリプト notdll.sh を開発しました。
https://gist.github.com/kenjiuno/bdbd6c3311f4abc94e6ad1b3ac74bdbf
---
ちなみに依存している xxx.dll たちを収集したい場合のコマンドはこちら。
$ cygcheck.exe ./pdftoppm.exe | tr -d '\r' | tr '\\' '/' | grep -vi "system32" | xargs -L1 -I{} cp {} .
今日のバージョン
$ cygcheck.exe ./smbclient | grep -Eoe "cyg[^\.]+\.dll" | uniq | xargs which | xargs.exe -I "SRC" cp SRC .
---
MinGW32 (32 ビット版)
cdecl
- C ソースコードでは malloc
- .lib (.dll.a) ファイルでは _malloc
- DLL では malloc
stdcall
- C ソースコードでは GetProcAddress
- .lib (.dll.a) ファイルでは _GetProcAddress@8
- DLL では GetProcAddress
$ objdump -t /mingw32/i686-w64-mingw32/lib/libmsvcrt.a | grep "malloc"
[ 7](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000
_malloc
$ objdump -p /c/Windows/SysWOW64/msvcrt.dll | grep "malloc"
[1279]
malloc
$ objdump.exe -t /mingw32/lib/libz.dll.a | grep "deflate"
[ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000
_deflate[ 7](sec 3)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp_
_deflate
$ objdump.exe -t /mingw32/lib/libz.a | grep "deflate"
[ 16](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00001670
_deflate
$ objdump.exe -p /mingw32/bin/zlib1.dll | grep "deflate"
[ 17]
deflate
stdcall 規約関数にも付くようようです。
$ objdump -t /mingw32/i686-w64-mingw32/lib/libkernel32.a | grep "GetProcAddress"
[ 7](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000
_GetProcAddress@8
[ 8](sec 5)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp_
_GetProcAddress@8
$ objdump -p /c/Windows/SysWOW64/kernel32.dll | grep "GetProcAddress"
a3a58 21
GetProcAddress [ 684]
GetProcAddress