2012-11-01 30 views
9

Tôi có chương trình được viết bằng ngôn ngữ lắp ráp 32 bit ... Bây giờ tôi không thể biên dịch nó trên hệ điều hành 64 bit. Trên trường của chúng tôi họ là cụ thể và chương trình phải được viết trong phiên bản 32 bit. Đây là chương trình của tôi:Biên dịch 32 bit Assembler trên 64 bit ubuntu

bits 32 
extern _printf 
global _start 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

_start: 
    pushad 
    push dword message 
    call _printf 
    add esp, 4 
    popad 
    ret 

Bất kỳ ý tưởng nào? Tôi đã thử rất nhiều cách để biên dịch điều đó. Lỗi đầu ra sau khi biên dịch:

nasm -f elf64 vaja4.asm 
ld vaja4.o -o vaja4 
./vaja4 

đầu ra:

vaja4.o: In function `_start': 
vaja4.asm:(.text+0x7): undefined reference to `_printf' 
+0

không phải là printf không _printf? – iabdalkader

+0

Lỗi tương tự: vaja4.o: Trong hàm 'bắt đầu ': vaja4.asm: (. Văn bản + 0x7): tham chiếu không xác định đối với' printf' – Klemenko

Trả lời

15

sự thay đổi đầu tiên _printf để printf_start biểu tượng để main, sau đó sử dụng gcc để liên kết các đối tượng tập tin, mà sẽ tự động liên kết nó với libc, bạn cần thực hiện điều đó vì AFAIK bạn không thể liên kết tới libc mà không cần main. Ngoài ra, bạn nên sử dụng elf32 không elf64 khi lắp ráp vì mã có 32 bit hướng dẫn:

bits 32 
extern printf 
global main 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

main: 
    pushad 
    push dword message 
    call printf 
    add esp, 4 
    popad 
    ret 

Và xây dựng với:

nasm -f elf32 vaja4.asm 
gcc -m32 vaja4.o -o vaja4 
$./test 
$Hello world!! 

Có một hướng dẫn tốt đẹp ở đây:

http://jdefr.swippet.com/2012/03/22/using-libc-with-assembly/

Chỉnh sửa:

Kể từ bây giờ bạn đang biên soạn mã 32-bit trên một hệ thống 64-bit, bạn sẽ cần phải cài đặt phiên bản 32-bit của các thư viện

apt-get install ia32-libs 
+1

Vâng, đây là cách phù hợp. Nếu bạn muốn sử dụng libc, bạn nên sử dụng 'main' làm điểm vào và liên kết bằng cách sử dụng gcc để các phần thích hợp của libc được kéo vào và khởi tạo/tắt máy được thực hiện. Ngoài ra, chỉ cần trả về các tác phẩm từ 'main', nếu bạn tạo một binary mà không cần libc, bạn phải sử dụng một lệnh gọi hệ thống thoát. – Jester

+0

Tôi đã cố gắng theo cách của bạn. Sau khi gcc -m32 vaja4.o -o vaja4 nó cho tôi rằng đầu ra lỗi: http://pastebin.com/jX3N2GSJ – Klemenko

+0

bạn cần cài đặt thư viện 32 bit apt-get install ia32-libs – iabdalkader

1

Có vẻ với tôi như bạn quên để liên kết chống lại các thư viện C, đó là một phần cung cấp các printf chức năng (và những người khác):

ld vaja4.o -o vaja4 -lc 
4

Tôi nghi ngờ lỗi bạn thấy là do sự cố 32/64 bit. Lỗi mà bạn thấy có nghĩa là:

vaja4.asm:(.text+0x7): undefined reference to `_printf' 

rõ ràng cho bạn biết ký hiệu _printf không xác định nghĩa là thư viện cho chức năng printf không được liên kết.

bước liên kết của bạn tức là

ld vaja4.o -o vaja4 

không bao gồm bất kỳ thư viện. Bạn cần liên kết chương trình của bạn với một thư viện có thể cung cấp định nghĩa về hàm printf. Tôi tin rằng ld nên chọn thư viện tự nó mà không làm phiền bạn với những thông điệp này nhưng vì nó không thể tìm thấy một thư viện C phù hợp cho chức năng này, tôi đoán bạn không có các thư viện cần thiết tức là thư viện 32 bit hoặc 64 bị thiếu.

Dù sao, plz thử theo trình tự sau các lệnh để lắp ráp và liên kết chương trình của bạn:

nasm -f elf vaja4.asm 
ld -m elf_i386 vaja4.o vaja4 
./vaja4 
+0

Hoặc thậm chí 'ld -m elf_i386 -I/lib/ld-linux.so .2 -lc vaja4.o -o vaja4' Có thể không cần chuyển đổi '-I' - chắc chắn cần' -lc' và '-o' trên tên tập tin đầu ra. Nhãn '_start' được nhảy tới, không được gọi. vì vậy bạn không thể 'ret' từ nó. Dễ sử dụng 'main' và gcc ... –

+0

hoặc' ld -m elf_i386 -s -o vaja4 vaja4.o' để liên kết giai đoạn. –

7

Trên Ubuntu 12.10, bạn cần phải cài đặt các gói phát triển đầu tiên

sudo apt-get update 
sudo apt-get install libc6-dev-i386 

cho

gcc -m32 vaja4.o -o vaja4 

để làm việc.

+0

hoạt động như một sự quyến rũ. –