“未定义的符号_memset”

时间:2011-08-10 10:33:05

标签: c linker linker-errors sparc

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

/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

有趣的是,memset没有在reconf.c中引用,而且我也对整个目录进行了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:致命:library -lc:未找到     ld:致命:文件处理错误。没有输出写入q

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

混淆

编辑II:

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

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

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

非常感谢!

3 个答案:

答案 0 :(得分:2)

可能你做过:

struct S v = { 0 };

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

uint8_t b[100] = { 0 };

有些编译器会隐式使用内置的memset(或memcpy)来处理这类事情。然后,内置的memset被称为_memset(在您的情况下)。一旦你链接了你的libc(或者在你的情况下提供标准功能的东西)没有提供它,你就会收到这个链接错误。

答案 1 :(得分:1)

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

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

只需将-lc添加到命令行

即可

答案 2 :(得分:0)

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

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

来自man gcc

  

-nodefaultlibs

     
    

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

  

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