2016-09-11 14 views
5

CÂU HỎI THƯỜNG GẶP Nên tạo biểu tượng chính toàn cầu, để trình liên kết có thể tìm thấy nó trong tệp đối tượng khi liên kết. Mã đã sửa.cách gọi mã được viết bằng C từ lắp ráp?

Khi làm nhiệm vụ, đã cố gắng để gọi hàm C đơn giản từ việc lắp ráp (YASM lắp ráp):

Wrote C chức năng:

#include <stdio.h> 

void 
func_in_c(char *s) 
{ 
     printf("%s", s); 
} 

viết gọi mã lắp ráp:

 segment .data 
str_t_c db "Wow", 0 

     segment .text 
     global main ; That is the solution - let linker find global symbol 
     extern printf 
     extern func_in_c 
main: 
     push rbp 
     mov rbp, rsp 
     lea rdi, [str_to_c] 
     call func_in_c 
     leave 
     ret 

biên soạn lắp ráp:

yasm -f elf64 -m amd64 -g dwarf2 main.asm 

biên dịch mã c:

gcc -o main_c.o -c main_c.c 

cố gắng liên kết cả hai tập tin đối tượng vào đơn thực thi tập tin nhị phân:

gcc -o main main_c.o main.o 

có:

... 
In function _start: 
(.text+0x20): undefined reference to main 
... 

Bạn có bất cứ lời đề nghị làm thế nào để sửa lệnh/code để xây dựng thực thi? Có, tôi đã đọc các câu hỏi tương tự (sử dụng trình kết hợp NASM, không có giải pháp nào hoạt động).

+2

Tạo nhãn 'main' toàn cầu. Đối với GNU, nó là '.global main', tôi không biết về yasm. – Downvoter

+0

Hoạt động, cảm ơn bạn. @Downvoter, viết như một câu trả lời, vì vậy tôi có thể chấp nhận nó. –

Trả lời

3

Trước tiên, bạn cần tạo nhãn main toàn cầu, vì nếu không, tệp đối tượng sẽ không chứa biểu tượng và trình liên kết sẽ không nhận ra nó.

Các vấn đề liên quan