![]() |
foo.asm 和 bar.c 之間的使用關係 |
程式碼
foo.asm
; $ nasm -f elf foo.asm -o foo.o ; $ gcc -c bar.c -o bar.o ; $ ld -s hello.o bar.o -o foobar ; $ ./foobar ; $ the 2nd one ; $ extern choose [section .data] num1st dd 3 num2nd dd 4 [section .text] global _start ; 導出此入口,以便讓連接器(ld)識別 global myprint ; 導出這個函數,讓 bar.c 使用 _start: push dword [num2nd] push dword [num1st] call choose add esp, 8 mov ebx, 0 mov eax, 1 int 0x80 ; 系統使用 ; void myprint (char *msg, int len) myprint: mov edx, [esp + 8] ; len mov ecx, [esp + 4] ; msg mov ebx, 1 mov eax, 4 int 0x80 ; 系統使用 ret
bar.c
void myprint (char *msg, int len); int choose (int a, int b) { if (a >= 6) myprint ("the 1st one\n", 13); else myprint ("the 2nd one\n", 13); return 0; }
步驟
- 編譯 foo.asm 為 ELF 格式的檔案 (nasm -f elf foo.asm foo.o)
- 編譯 bar.c (gcc -c bar.c -o bar.o)
- 連結 foo.o 與 bar.o 為一執行檔 (ld -s foo.o bar.o -o foobar)
註:ELF (Executable and Linkable Format)
留言
張貼留言