SOLVED QUESTION Ana simgeyi global yapmalı, böylece linker bağlantı sırasında nesne dosyasında bulabilir. Düzeltilmiş kod. görevi yapıyorMontajda C ile yazılmış kodu nasıl çağırılır?
, (YASM montajcı) derlemesinden basit C işlevi çağırmak için çalıştı:
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
derlenmiş:
#include <stdio.h>
void
func_in_c(char *s)
{
printf("%s", s);
}
montaj kodu çağırarak yazdı:
C fonksiyonunu yazdım montaj:
yasm -f elf64 -m amd64 -g dwarf2 main.asm
derlenmiş c kodu:
gcc -o main main_c.o main.o
var:
...
In function _start:
(.text+0x20): undefined reference to main
...
nasıl komutları düzeltmek için herhangi bir öneri var mı
gcc -o main_c.o -c main_c.c
tek yürütülebilir ikili dosyaya hem nesne dosyalarını bağlamaya çalıştı/kod yürütülebilir oluşturmak için? Evet, benzer soruları okudum (NASM assembler kullanarak, çözüm çalışması yok).
"main" etiketini global yapın. GNU için, '.global main', yasm hakkında bilmiyorum. – Downvoter
Çalışmaları, teşekkür ederim. @Downvoter, bir cevap yaz, ben de kabul edebilirim. –