Compiling
無法執行使用 NASM 建構的執行檔
我正在嘗試使用以下 NASM 命令組裝下面的程序集源文件:
nasm -f elf -o test.o test.asm
這完成沒有錯誤,然後我嘗試將執行檔連結到
ld
:ld -m elf_i386 -e main -o test test.o -lc
這似乎也成功了,然後我嘗試執行執行檔:
$ ./test bash: ./test: No such file or directory
不幸的是,它似乎不起作用。我嘗試
ldd
在執行檔上執行:linux-gate.so.1 => (0xf777f000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7598000) /usr/lib/libc.so.1 => /lib/ld-linux.so.2 (0xf7780000)
我安裝了
lsb-core
軟體包並驗證了它的/lib/ld-linux.so.2
存在。為什麼我仍然無法執行執行檔?我試圖在執行 64 位版本的 Ubuntu 15.04 的機器上執行此操作。
原始碼:
; This code has been generated by the 7Basic ; compiler <http://launchpad.net/7basic> extern printf extern scanf extern read extern strlen extern strcat extern strcpy extern strcmp extern malloc extern free ; Initialized data SECTION .data s_0 db "Hello, World!",0 printf_i: db "%d",10,0 printf_s: db "%s",10,0 printf_f: db "%f",10,0 scanf_i: db "%d",0 scanf_f: db "%lf",0 ; Uninitialized data SECTION .bss v_12 resb 4 v_0 resb 4 v_4 resb 8 SECTION .text ; Code global main main: finit push ebp mov ebp,esp push 0 pop eax mov [v_12], eax l_0: mov eax, [v_12] push eax push 5 pop edx pop eax cmp eax, edx jl l_2 push 0 jmp l_3 l_2: push 1 l_3: pop eax cmp eax, 0 je l_1 push s_0 push printf_s call printf add esp, 8 mov eax, [v_12] push eax push 1 pop edx pop eax add eax, edx push eax pop eax mov [v_12], eax jmp l_0 l_1: mov esp,ebp pop ebp mov eax,0 ret
這是輸出
strings test
:/usr/lib/libc.so.1 libc.so.6 strcpy printf strlen read malloc strcat scanf strcmp free GLIBC_2.0 t'hx Hello, World! .symtab .strtab .shstrtab .interp .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.plt .text .eh_frame .dynamic .got.plt .data .bss test.7b.out printf_i printf_s printf_f scanf_i scanf_f v_12 _DYNAMIC _GLOBAL_OFFSET_TABLE_ strcmp@@GLIBC_2.0 read@@GLIBC_2.0 printf@@GLIBC_2.0 free@@GLIBC_2.0 _edata strcat@@GLIBC_2.0 strcpy@@GLIBC_2.0 malloc@@GLIBC_2.0 scanf@@GLIBC_2.0 strlen@@GLIBC_2.0 _end __bss_start main
crt1.o
如果要呼叫 libc 函式,還需要連結啟動片段和其他片段。連結過程可能非常複雜,因此您最好使用gcc
它。在 amd64 Ubuntu 上,您可以:
sudo apt-get install gcc-multilib gcc -m32 -o test test.o
-v
您可以通過添加選項來查看連結的文件和命令。