Không thể chạy một tệp thực thi được xây dựng bằng NASM


7

Tôi đang cố gắng lắp ráp tệp nguồn lắp ráp bên dưới bằng lệnh NASM sau:

nasm -f elf -o test.o test.asm

Điều này hoàn thành không có lỗi và sau đó tôi cố gắng liên kết một tệp thực thi với ld:

ld -m elf_i386 -e main -o test test.o -lc

Điều này cũng có vẻ thành công và sau đó tôi cố gắng chạy chương trình thực thi:

$ ./test
bash: ./test: No such file or directory

Thật không may, nó dường như không hoạt động. Tôi đã thử chạy lddtrên thực thi:

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)

Tôi đã cài đặt lsb-coregói và xác minh rằng /lib/ld-linux.so.2có tồn tại. Tại sao tôi vẫn không thể chạy thực thi?

Tôi đang cố gắng thực hiện điều này trên một máy chạy phiên bản 64 bit của Ubuntu 15.04.

Mã nguồn:

; 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

Đây là đầu ra của 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

Để tôi hiểu, bạn đang lắp ráp mã 32 bit x86 (i386) trên bản cài đặt 64 bit?
Bruce Ediger

Bạn có thể thử: ld -m elf_i386 -e main -o test test.o -lc -I /path/ld-linux.so.2?
Taliezin

@taliezin: Chỉ cần thử điều đó và dường như không có sự khác biệt nào.
Nathan Osman

@Gilles Ở đây chúng tôi đi: paste.ubfox.com/11552354
Nathan Osman

Điều đó /usr/lib/libc.so.1có lẽ nên được /lib/ld-linux.so.2. Không biết làm thế nào nó đạt được điều đó.
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


1

Bạn cũng cần liên kết các đoạn khởi động như crt1.ovà những thứ khác nếu bạn muốn gọi các hàm libc. Quá trình liên kết có thể rất phức tạp, vì vậy bạn nên sử dụng nó tốt hơn gcc.

Trên Ubuntu amd64, bạn có thể:

sudo apt-get install gcc-multilib
gcc -m32 -o test test.o

Bạn có thể xem các tập tin và lệnh cho liên kết bằng cách thêm -vtùy chọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.