我将外部asm包含到c中,当我尝试编译时遇到错误。
我正在像这样编译c文件-g++ testing.c
错误:
cc0FHCkn.o:testing.c :(。text + 0xe):对helloWorld的未定义引用 collect2.exe:错误:ld返回1退出状态
C代码:
#include<stdio.h>
extern "C" int helloWorld();
int main() {
printf("Its - ",helloWorld());
}
ASM代码:
.code
helloWorld proc
mov rax, 123
ret
helloWorld endp
end
答案 0 :(得分:1)
注意:我使用该答案可以说出更多的话,并且可以使用gcc。
首先,仅执行g++ testing.c
g ++就无法与未指定的汇编文件链接,因此当然缺少 helloWorld 。
如果我有文件 hw.c :
int helloWorld()
{
return 123;
}
我要求通过选项-S
来生成源汇编器(我也使用-O
来减小汇编器源大小),所以我不必手工编写汇编器文件,确保它与 gcc 兼容:
/tmp % gcc -O -S hw.c
产生了文件 hw.s :
/tmp % cat hw.s
.file "hw.c"
.text
.globl helloWorld
.type helloWorld, @function
helloWorld:
.LFB0:
.cfi_startproc
movl $123, %eax
ret
.cfi_endproc
.LFE0:
.size helloWorld, .-helloWorld
.ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-16)"
.section .note.GNU-stack,"",@progbits
/tmp %
还具有文件 m.c :
#include <stdio.h>
extern int helloWorld();
int main()
{
printf("%d\n", helloWorld());
return 0;
}
我可以做到:
/tmp % gcc m.c hw.s
/tmp % ./a.out
123
我建议您执行相同的操作,用C编写helloWorld,然后生成带有选项-S
的汇编程序,以确保您遵循函数定义中的gcc要求
答案 1 :(得分:0)
1。)从程序集文件创建ELF对象文件
nasm -f elf64 -o assembly.o assembly.asm
2。)创建test.c文件的ELF对象文件
gcc -c testing.c -o testing.o
3。)将ELF目标文件链接在一起以创建最终的可执行文件。
gcc -o testing assembly.o testing.o
4。)运行最终的可执行文件
./testing
使用extern int hellowrold();