2018年4月12日木曜日

xxx.dll.a ではなく xxx.notdll.a へ

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

0 件のコメント:

コメントを投稿