编译程序集文件时出现问题 - 错误:未定义对“函数名”的引用

Posted

技术标签:

【中文标题】编译程序集文件时出现问题 - 错误:未定义对“函数名”的引用【英文标题】:Problems compiling assembly file - Error: undefined reference to `function name' 【发布时间】:2014-09-26 04:17:59 【问题描述】:

我正在尝试查看我的教授给我们的测试程序,但我无法编译它。我在 Ubuntu 14.04 上。我正在用

编译它
gcc -Wall test.c AssemblyFunction.S -m32 -o test

我在 64 位机器上运行代码时遇到了问题,并且读到添加 -Wall 和 -m32 将允许它工作。这样做解决了我遇到的第一个问题,但现在我得到了 error: undefined reference to `addnumbersinAssembly'

这里是 C 文件

#include <stdio.h>
#include <stdlib.h>

extern int addnumbersinAssembly(int, int);
int main(void)


    int a, b;
    int  res;

    a = 5;
    b = 6;


    // Call the assembly function to add the numbers
    res = addnumbersinAssembly(a,b);
    printf("\nThe sum as computed in assembly is : %d", res);

    return(0);

这里是汇编文件

.global _addnumbersinAssembly
_addnumbersinAssembly:
    pushl   %ebp
    movl    %esp,%ebp


    movl 8(%ebp), %eax
    addl 12(%ebp), %eax    # Add the args


    movl    %ebp,%esp
    popl    %ebp
    ret

感谢您的宝贵时间。我一直在努力解决这个问题好几个小时,所以我很感激任何帮助。

【问题讨论】:

【参考方案1】:

我相信使用 GCC,您会想要删除汇编文件中的 _。所以这些行:

.global _addnumbersinAssembly
_addnumbersinAssembly:

应该是:

.global addnumbersinAssembly
addnumbersinAssembly:

可以在 *** question/answer 中找到有关此问题的更多信息。

-m32 编译参数是必需的,因为您拥有的汇编代码需要重写以支持某些 64 位操作。在您的情况下,它是堆栈操作。 -Wall 不需要编译,但它确实会打开更多警告。

【讨论】:

哇,谢谢!如果您不介意我问,“_”是什么意思。教授只是告诉我们把它放进去,根本没有解释那些标题行。 C 编译器通常遵循自动在全局(非静态)变量/函数上附加下划线的旧约定,以防止与 C 运行时库发生名称冲突(初始化内存的代码设置运行环境并执行你的 main() 函数)。他们不希望人们在他们的.c 中创建符号,这些符号可能会(意外地)替换允许 C 程序运行的基本代码(变量和函数)。

以上是关于编译程序集文件时出现问题 - 错误:未定义对“函数名”的引用的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义函数 codeigniter\locale_set_default() 时出现 codeigniter 错误

多重通知:调用函数时出现未定义的变量错误[重复]

构建 Vue 项目时出现错误“无法安装组件:未定义模板或渲染函数”

链接 cxx 可执行文件时出现 Cmake 错误未定义引用

错误:图像未定义(使用Image()函数时出现问题)

模拟调用“upvote”的效果时出现异常。类型错误:未定义不是函数