一个小实验
编辑hello.h
如下:
#ifndef HELLO_H
#define HELLO_H
void myprint(const char* name);
#endif
编辑hello.c
如下:
#include <stdio.h>
void myprint(const char* name)
{
printf(name);
printf("\n");
_zeqi_printf("end\n");
}
编辑main.c
如下:
#include "hello.h"
int main()
{
myprint("test");
return 0;
}
执行如下命令进行编译,生成hello.o
和main.o
。:
gcc -c hello.c
gcc -c main.c
执行如下命令生成可执行文件:
gcc hello.o main.o -o hello
会出现以下错误:
/usr/bin/ld: hello.o: in function `myprint':
hello.c:(.text+0x38): undefined reference to `_zeqi_printf'
collect2: error: ld returned 1 exit status
可知出现错误的原因是hello.c
的myprint
函数中调用的_zeqi_printf
函数未定义。
解决问题的方法就是让编译器找到_zeqi_printf
的定义。为此,编辑repair.c
如下:
#include <stdio.h>
void _zeqi_printf(const char* name)
{
printf("zeqi_");
printf(name);
printf("\n");
}
执行如下命令编译repaire.c
,生成repaire.o
:
gcc -c repair.c
再执行如下命令,成功执行无异常:
gcc hello.o repair.o main.o -o hello
‘undefined reference to xxx’问题的一种解决思路
**适用场景:**一些静态代码分析工具需要对目标源码进行编译才能执行代码分析。若此时编译出现‘undefined reference to xxx’的错误,则可以用该思路解决。
思想是缺什么函数补什么函数。编辑my_repair.c
,在该文件中定义好所有‘undefined reference to xxx’错误中缺失的函数,函数的参数个数、参数类型、返回值类型则需要通过逆向分析获取。
定义好my_repair.c
之后,编译生成my_repair.o
,然后在编译目标程序时,将my_repair.o
加入到生成可执行文件的过程中即可。