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).
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
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ó. –