2

我问了一个类似的问题,但我有一些更新让我很困惑。本质上,我想用链接器链接多个目标文件,如下所示:

/usr/ccs/bin/ld -o q -e start_master -dn -z defs -M ../../../mapfile.q {list of object files}

我收到以下错误:

Undefined                       first referenced 
 symbol                             in file
_memset                             reconf.o

有趣的是,在 reconf.c 中没有引用 memset,我也对整个目录进行了 grep,但在任何其他文件中也没有对 _memset 的引用。因此,我想知道为什么我从链接器收到此错误消息,尽管在我的源代码中没有实际使用 _memset。有人知道这里会发生什么吗?

非常感谢,这个错误正在驱使我们思考!

编辑:

我尝试将路径添加到 memset 库并将其与 -lc 链接并以详细模式运行:

/usr/ccs/bin/ld -o q -e start_master -dn -z defs -z verbose -L/usr/lib -M ../../../mapfile.q {list of object files} -lc

然后我收到以下错误: ld: fatal: library -lc: not found ld: fatal: 文件处理错误。没有输出写入 q

这虽然 libc.so 显然在 /usr/lib ...

令人困惑

编辑二:

进行更多研究后,似乎在 Solaris 10 上静态链接消失了,您可以在此处阅读:

http://blogs.oracle.com/rie/entry/static_linking_where_did_it

可能这是我的问题。有谁知道如何重写我的链接器命令以解决此问题?

非常感谢!

4

3 回答 3

2

可能你做了:

struct S v = { 0 };

或者

struct S v;
v = (some const-variable).

或者

uint8_t b[100] = { 0 };

.

一些编译器隐式地将内置的 memset(或 memcpy)用于此类事情。然后,内置的 memset 称为 _memset (在您的情况下)。一旦您链接并且您的 libc(或在您的情况下提供标准功能的东西)不提供它,您就会收到此链接错误。

于 2011-08-10T10:37:10.207 回答
1

假设您在 Solaris 上,您会在libc.so库中找到 memset:

/usr/lib-> nm libc.so | grep memset
[7122]  |    201876|     104|FUNC |GLOB |0    |9      |_memset

只需添加-lc到命令行

于 2011-08-10T10:39:23.587 回答
0

Memset 是标准 C 库中的库函数。如果您不使用 gcc 进行链接(默认情况下将您的文件与标准库链接),您应该明确地将您的程序与 libc 链接。

在另一个选项中,您可能不使用 libc。在这种情况下,memset 调用可以由 gcc 生成。

来自man gcc

-nodefaultlibs

链接时不要使用标准系统库。只有您指定的库将被传递给链接器,指定系统库链接的选项,例如 -static-libgcc 或 -shared-libgcc 将被忽略。标准启动文件正常使用,除非使用 -nostartfiles。编译器可以生成对 memcmp、memset、memcpy 和 memmove 的调用。这些条目通常由 libc 中的条目解析。指定此选项时,应通过某些其他机制提供这些入口点。

在这种情况下,只需编写 memset(这是一个简单的过程)并将其提供给链接器。

于 2011-08-10T10:46:06.480 回答