Pada tutorial kali ini akan dibahas mengenai cara sederhana untuk mengubah file
object (.obj) menjadi .dll pada windows dimana kita tidak mempunyai file source
dan tidak juga memiliki file defenisi, dan hanya memiliki file objectnya saja.
Sebelumnya akan dijelaskan terlebih dahulu cara membuat dll menggunakan bahasa
C dan compiler gcc (mingw).
Author: drubizca
Group: RNDC
-----[ Langkah-langkah
* Berikut ini adalah contoh source code sederhana menggunakan bahasa C untuk
membuat dll. Kita menggunakan fungsi "_DllMainCRTStartup" dan bukan "DllMain"
tentunya dengan alasan tertentu[1]. Selain itu, kita juga menggunakan direk-
tif 'extern "C" { ... }' untuk mencegah terjadinya name mangling[2]. Dan
agar fungsinya bisa dieksport, maka digunakan keyword "__declspec(dllexport)"
untuk lebih jelasnya bisa dibaca pada MSDN[3]. Listingnya adalah sebagai ber-
ikut:
* Selanjutnya, kita akan melakukan kompilasi tanpa proses linking terhadap kode
tersebut.
* Lalu kita melihat fungsi apa saja yang ada pada file object dari proses kom-
pilasi tersebut menggunakan aplikasi nm.
* Terlihat bahwa fungsi "pesan" namanya berubah menjadi "_pesan", hal tersebut
wajar. Selanjutnya kita akan membuat file defenisi untuk digunakan pada pro-
ses linking untuk menentukan fungsi apa saja yang dieksport. Formatnya seder-
hana, cukup menuliskan keyword "EXPORTS" dan spasi kemudian nama-nama fungsi
yang akan dieksport. Untuk contoh dll yang akan kita buat, cukup membuat file
"contoh.def" (namanya tidak harus contoh.def)[4], dan isinya adalah baris ber
ikut:
* Simpan file "contoh.def" lalu kita akan melanjutkan proses linking dengan
perintah seperti ini:
* Selanjutnya kita dapat langsung menguji file .dll yang dihasilkan dengan
menggunakan aplikasi bawaan windows yaitu "rundll32" untuk memanggil fungsi
yang dieksport dari file "contoh.dll" dalam hal ini adalah fungsi "pesan".
Caranya sebagai berikut:
* Jika perintah tersebut dijalankan, maka akan muncul messagebox dengan caption
"pesan" dan teksnya "hello all ". Berarti dll yang kita buat berhasil. Kini
saatnya melanjutkan ke point utama yaitu membuat file dll dari file object
yang tidak disertai file pendukung lainnya.
* Langkahnya sama dengan di atas, yaitu pertama kita mencari fungsi apa saja
yang ada dan bisa diakses dari file objectnya. Kita bisa menggunakan nm:
* Atau bisa juga menggunakan aplikasi dari microsoft visual c++/studio yaitu
dumpbin seperti berikut ini:
* Hasilnya sama, ada 8 fungsi dan fungsi-fungsi tersebut tinggal kita masukkan
ke dalam file definisi seperti ini:
* Simpan file definisi tersebut, kemudian lanjutkan dengan proses linking:
* Setelah selesai, kita dapat mengecek kembali apakah benar fungsi-fungsi
tersebut telah dieksport. Menggunakan dumpbin dengan perintah seperti ini:
* Nah, fungsi-fungsinya sudah dieksport, berarti tugas kita telah selesai
Sekian tutorial singkat kali ini, semoga bermanfaat.
-----[ Referensi
[1] Initializing a DLL
http://msdn.microsoft.com/en-us/library/7h0a8139.aspx
[2] Name mangling
http://en.wikipedia.org/wiki/Name_mangling
[3] __declspec
http://msdn.microsoft.com/en-us/library/dabb5z75(v=vs.80).aspx
[4] Exporting from a DLL Using DEF Files
http://msdn.microsoft.com/en-us/library/d91k01sh(v=vs.80).aspx
Author: drubizca
Group: RNDC
object (.obj) menjadi .dll pada windows dimana kita tidak mempunyai file source
dan tidak juga memiliki file defenisi, dan hanya memiliki file objectnya saja.
Sebelumnya akan dijelaskan terlebih dahulu cara membuat dll menggunakan bahasa
C dan compiler gcc (mingw).
Author: drubizca
Group: RNDC
-----[ Langkah-langkah
* Berikut ini adalah contoh source code sederhana menggunakan bahasa C untuk
membuat dll. Kita menggunakan fungsi "_DllMainCRTStartup" dan bukan "DllMain"
tentunya dengan alasan tertentu[1]. Selain itu, kita juga menggunakan direk-
tif 'extern "C" { ... }' untuk mencegah terjadinya name mangling[2]. Dan
agar fungsinya bisa dieksport, maka digunakan keyword "__declspec(dllexport)"
untuk lebih jelasnya bisa dibaca pada MSDN[3]. Listingnya adalah sebagai ber-
ikut:
Code:
1 #include <windows.h>
2
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6
7 /* fungsi yang dieksport */
8 __declspec(dllexport) void pesan()
9 {
10 MessageBox(NULL, TEXT("hello all :D"), TEXT("pesan"), MB_OK | MB_ICONINFORMATION);
11 }
12
13 /* entry point */
14 BOOL WINAPI _DllMainCRTStartup(HINSTANCE hinst, DWORD dwreason, LPVOID foo)
15 {
16 return 1;
17 }
18
19 #ifdef __cplusplus
20 }
21 #endif
tersebut.
Code:
gcc -Wall -c -s -o contoh.obj contoh.c
pilasi tersebut menggunakan aplikasi nm.
Code:
nm -g contoh.obj
0000002f T __DllMainCRTStartup@12
U _MessageBoxA@1642EQ
00000000 T _pesan
wajar. Selanjutnya kita akan membuat file defenisi untuk digunakan pada pro-
ses linking untuk menentukan fungsi apa saja yang dieksport. Formatnya seder-
hana, cukup menuliskan keyword "EXPORTS" dan spasi kemudian nama-nama fungsi
yang akan dieksport. Untuk contoh dll yang akan kita buat, cukup membuat file
"contoh.def" (namanya tidak harus contoh.def)[4], dan isinya adalah baris ber
ikut:
Code:
EXPORTS pesan
perintah seperti ini:
Code:
gcc -Wall -mdll -s -o contoh.dll contoh.obj contoh.def
menggunakan aplikasi bawaan windows yaitu "rundll32" untuk memanggil fungsi
yang dieksport dari file "contoh.dll" dalam hal ini adalah fungsi "pesan".
Caranya sebagai berikut:
Code:
rundll32 contoh.dll,pesan
"pesan" dan teksnya "hello all ". Berarti dll yang kita buat berhasil. Kini
saatnya melanjutkan ke point utama yaitu membuat file dll dari file object
yang tidak disertai file pendukung lainnya.
* Langkahnya sama dengan di atas, yaitu pertama kita mencari fungsi apa saja
yang ada dan bisa diakses dari file objectnya. Kita bisa menggunakan nm:
Code:
nm -g asmxml.obj
00000076 T _ax_classFromElement
00000096 T _ax_classFromString
00000000 T _ax_initialize
0000005e T _ax_initializeClassParser
00000010 T _ax_initializeParser
0000002c T _ax_parse
0000006a T _ax_releaseClassParser
00000020 T _ax_releaseParser
dumpbin seperti berikut ini:
Code:
dumpbin /symbols asmxml.obj
Microsoft (R) COFF/PE Dumper Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file asmxml.obj
File Type: COFF OBJECT
COFF SYMBOL TABLE
000 00000000 SECT1 notype Static | .flat
001 00000000 SECT2 notype Static | .asmdata
002 00000000 SECT1 notype External | _ax_initialize
003 00000010 SECT1 notype External | _ax_initializeParser
004 00000020 SECT1 notype External | _ax_releaseParser
005 0000002C SECT1 notype External | _ax_parse
006 0000005E SECT1 notype External | _ax_initializeClassParser
007 0000006A SECT1 notype External | _ax_releaseClassParser
008 00000076 SECT1 notype External | _ax_classFromElement
009 00000096 SECT1 notype External | _ax_classFromString
String Table Size = 0x9E bytes
Summary
8 .asmdata
44D7 .flat
ke dalam file definisi seperti ini:
Code:
EXPORTS ax_initialize
ax_initializeParser
ax_releaseParser
ax_parse
ax_initializeClassParser
ax_releaseClassParser
ax_classFromElement
ax_classFromString
Code:
gcc -Wall -mdll -s -o asmxml.dll asmxml.obj asmxml.def
tersebut telah dieksport. Menggunakan dumpbin dengan perintah seperti ini:
Code:
dumpbin /exports asmxml.dll
Microsoft (R) COFF/PE Dumper Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file asmxml.dll
File Type: DLL
Section contains the following exports for asmxml.dll
00000000 characteristics
50D3134D time date stamp Thu Dec 20 20:31:57 2012
0.00 version
1 ordinal base
8 number of functions
8 number of names
ordinal hint RVA name
1 0 00003076 ax_classFromElement
2 1 00003096 ax_classFromString
3 2 00003000 ax_initialize
4 3 0000305E ax_initializeClassParser
5 4 00003010 ax_initializeParser
6 5 0000302C ax_parse
7 6 0000306A ax_releaseClassParser
8 7 00003020 ax_releaseParser
Summary
1000 .asmdata
1000 .bss
1000 .data
1000 .edata
5000 .flat
1000 .idata
1000 .rdata
1000 .reloc
1000 .text
Sekian tutorial singkat kali ini, semoga bermanfaat.
-----[ Referensi
[1] Initializing a DLL
http://msdn.microsoft.com/en-us/library/7h0a8139.aspx
[2] Name mangling
http://en.wikipedia.org/wiki/Name_mangling
[3] __declspec
http://msdn.microsoft.com/en-us/library/dabb5z75(v=vs.80).aspx
[4] Exporting from a DLL Using DEF Files
http://msdn.microsoft.com/en-us/library/d91k01sh(v=vs.80).aspx
Author: drubizca
Group: RNDC
Last edited: