C中包含C外部asm中的未定义参考错误

时间:2019-02-15 12:08:00

标签: c assembly

我将外部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

2 个答案:

答案 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();