“未定义的符号_memset”

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

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

我收到以下错误:

 Undefined first referenced symbol in file _memset reconf.o 

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

非常感谢,这个错误正在驱使我们精神上!

编辑:

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

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

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

虽然libc.so显然在/ usr / lib中…

扑朔迷离

编辑二:

做一些更多的研究似乎在Solaris 10上静态链接消失了,你可以在这里阅读:

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

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

非常感谢!

可能你做了:

 struct S v = { 0 }; 

要么

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

要么

 uint8_t b[100] = { 0 }; 

有些编译器会隐式使用内置的memset(或memcpy)来实现这些function。 然后内置的memset被称为_memset(在你的情况下)。 一旦你链接和你的libc(或在你的情况下提供标准function)没有提供它,你得到此链接错误。

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

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

只需将-lc添加到命令行即可

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

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

来自man gcc

-nodefaultlibs

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

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