在 C 中,什么构成符号的 "undefined reference"?
In C, what constitutes an "undefined reference" to a symbol?
我正在阅读有关 GCC 链接器 --wrap
选项的 GNU 文档,该选项可用于模拟函数以进行测试。
https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html 表示如下:
--wrap symbol
Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to __wrap_symbol. Any undefined reference to __real_symbol will be resolved to symbol. This can be used to provide a wrapper for a system function. The wrapper function should be called __wrap_symbol. If it wishes to call the system function, it should call __real_symbol.
我注意到它说 任何未定义的符号引用都将解析为 __wrap_symbol,但它没有说明 [=28= 到底是什么]undefined reference to symbol 的意思。有谁知道具体什么是 undefined?
我很困惑,因为我创建了一个成功模拟 read
函数的示例程序(它是用 gcc test.c -o test -Wl,--wrap=read
编译的以启用模拟)。为什么链接器认为这个符号未定义?我包括了 unistd.h
,所以不应该定义 read
吗?我以为文档说 --wrap
只适用于未定义的符号?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define DUMMY_STR "I don't care because this function is mocked."
#define DUMMY_LEN (strlen(DUMMY_STR))
ssize_t __wrap_read(int fd, void *buf, size_t count)
{
sprintf(buf, DUMMY_STR);
return DUMMY_LEN;
}
int main()
{
char buf[128] = {'[=11=]'};
puts("Press anything, then ENTER, to continue");
read(1, buf, sizeof(buf) - 1);
puts(buf);
return 0;
}
包括头文件只是声明符号,它不会定义它们——它们将是 undefined 在你的 test.c 编译单元中,因为它从来没有定义它们。
读取符号实际上是在 libc.so 中 定义的 -- C 标准库 -- 但是当链接你的程序时,它首先看到你的编译单元(test.o) 此时 read 仍然是 undefined。所以对 read
的引用被映射到 __wrap_read
.
定义和声明是两个不同的东西。相关但不同。
我正在阅读有关 GCC 链接器 --wrap
选项的 GNU 文档,该选项可用于模拟函数以进行测试。
https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html 表示如下:
--wrap symbol
Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to __wrap_symbol. Any undefined reference to __real_symbol will be resolved to symbol. This can be used to provide a wrapper for a system function. The wrapper function should be called __wrap_symbol. If it wishes to call the system function, it should call __real_symbol.
我注意到它说 任何未定义的符号引用都将解析为 __wrap_symbol,但它没有说明 [=28= 到底是什么]undefined reference to symbol 的意思。有谁知道具体什么是 undefined?
我很困惑,因为我创建了一个成功模拟 read
函数的示例程序(它是用 gcc test.c -o test -Wl,--wrap=read
编译的以启用模拟)。为什么链接器认为这个符号未定义?我包括了 unistd.h
,所以不应该定义 read
吗?我以为文档说 --wrap
只适用于未定义的符号?
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define DUMMY_STR "I don't care because this function is mocked."
#define DUMMY_LEN (strlen(DUMMY_STR))
ssize_t __wrap_read(int fd, void *buf, size_t count)
{
sprintf(buf, DUMMY_STR);
return DUMMY_LEN;
}
int main()
{
char buf[128] = {'[=11=]'};
puts("Press anything, then ENTER, to continue");
read(1, buf, sizeof(buf) - 1);
puts(buf);
return 0;
}
包括头文件只是声明符号,它不会定义它们——它们将是 undefined 在你的 test.c 编译单元中,因为它从来没有定义它们。
读取符号实际上是在 libc.so 中 定义的 -- C 标准库 -- 但是当链接你的程序时,它首先看到你的编译单元(test.o) 此时 read 仍然是 undefined。所以对 read
的引用被映射到 __wrap_read
.
定义和声明是两个不同的东西。相关但不同。