2015-07-12 21 views
5

Tôi đang sử dụng Kali linux 64 bit và tôi đang cố thực hiện các chương trình sau từ trang web của Tiến sĩ Paul carter. Lệnh gcc đưa ra lỗi. Tôi nên sử dụng những gì trong lệnh gcc?không thể biên dịch assembly:/usr/bin/ld: kiến ​​trúc i386 của tệp đầu vào `array1.o 'không tương thích với đầu ra i386: x86-64

nasm -f elf32 array1.asm 
[email protected]:assembly# gcc -o array1 array1.o array1c.c 
array1c.c:9:1: warning: ‘cdecl’ attribute ignored [-Wattributes] 
array1c.c:10:1: warning: ‘cdecl’ attribute ignored [-Wattributes] 
/usr/bin/ld: i386 architecture of input file `array1.o' is incompatible with i386:x86-64 output 
collect2: error: ld returned 1 exit status 
+0

Thử nghiệm với ngôn ngữ lắp ráp như là người chủ là một ý tưởng khủng khiếp. http://apple.stackexchange.com/a/192422/118588 có một lời giải thích tuyệt vời về những cạm bẫy của việc sử dụng root cho mọi thứ, áp dụng cho tất cả các hệ điều hành Unix, không chỉ OS X. Nó còn tồi tệ hơn khi thử nghiệm với ASM, vì bạn có thể vô tình thực hiện cuộc gọi hệ thống không mong muốn khởi động lại hệ thống của bạn hoặc tệ hơn. –

+0

Xem thêm http://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64-bit-system-gnu-toolchain/36901649#36901649 cho một hướng dẫn đầy đủ hơn với nhiều cách khác nhau của xây dựng các tệp nhị phân 32 hoặc 64 bit từ nguồn asm, có hoặc không có libc. –

Trả lời

5

Bạn đang cố gắng liên kết một đối tượng tập tin 32 bit i386 đến 64 bit thực thi (i386:x86-64). Thêm -m32 vào dòng biên dịch gcc để tạo tệp thực thi 32 bit.

+0

thêm -m32 không hoạt động .. gcc -m32 array1.o -o array1 /usr/bin/ld: không thể tìm thấy crt1.o: Không có tệp hoặc thư mục nào như vậy /usr/bin/ld: không thể tìm thấy crti.o : không có tập tin hoặc thư mục /usr/bin/ld: bỏ qua /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc.a không tương thích khi tìm kiếm -lgcc /usr/bin/ld: không thể tìm thấy - lgcc /usr/bin/ld: bỏ qua không tương thích /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so khi tìm kiếm -lgcc_s /usr/bin/ld: không thể tìm thấy -lgcc_s /usr/bin/ld: không thể tìm thấy -lc ..... –

+2

Bạn cần cài đặt các tệp phát triển glibc 32 bit cho gcc để liên kết. –

1

(oops, tôi chỉ lướt qua câu hỏi và nghĩ rằng bạn đang thực hiện độc lập với chỉ ld. Xem câu trả lời của cad cho gcc -m32, khi bạn muốn liên kết với libc và tất cả điều đó, thay vì chỉ thử một chút thí nghiệm như một độc lập.)

bạn phải nói với ld gì máy bạn muốn đầu ra là cho. Nó mặc định là kiểu gốc.

nasm -f elf32 array1.asm # or yasm 
ld -m elf_i386 array1.o -o 32bit-array1 

Thật không may, nhiều hướng dẫn/tài nguyên asm vẫn có ví dụ với mã 32 bit x86.

+0

Xin chào, cảm ơn nhưng tôi đang nhận được một loạt vấn đề hoàn toàn mới –

+0

ld: cảnh báo: không thể tìm thấy biểu tượng nhập _start; mặc định là 0000000008048080 array1.o: Trong hàm 'init_loop ': mảng1.asm: (. văn bản + 0x1d): tham chiếu không xác định đối với' puts' array1.o: Trong hàm 'Prompt_loop ': array1.asm :(. văn bản + 0x37): tham chiếu không xác định đối với 'printf ' mảng1.asm: (. văn bản + 0x46): tham chiếu không xác định đối với' scanf' array1.asm :(. text + 0x53): tham chiếu không xác định đối với 'dump_line ' array1. o: Trong hàm 'InputOK ': mảng1.asm: (. văn bản + 0x6a): tham chiếu không xác định đối với' printf' array1.asm :(. text + 0x77): tham chiếu không xác định đối với 'puts ' array1.o: In function 'print_loop ': –

+0

Mã của bạn định nghĩa' main', không phải '_start' và sử dụng các hàm thư viện, vì vậy bạn chỉ cần sử dụng gcc. Câu trả lời của tôi chỉ hữu ích nếu bạn đang viết một chương trình độc lập làm cho hệ thống của nó gọi trực tiếp. –

2

Đầu tiên cài đặt này:

sudo apt-get install gcc-multilib g++-multilib 

sau đó Assemeble và liên kết theo cách này:

nasm -f elf array1.asm -o array1.o 

và cuối cùng,

gcc -m32 array1.o -o array1.out 

và chạy,

./array1.out 

này nên làm việc ......

2
nasm -f elf64 array1.asm 

sau đó

ld -s -o array1 array1.o 
Các vấn đề liên quan