C &引用;未定义符号“U memset”;

C &引用;未定义符号“U memset”;,c,linker,linker-errors,sparc,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

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

/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's,但在其他任何文件中也没有对_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:致命:库-找不到lc:未找到 ld:致命:文件处理错误。没有写入q的输出

虽然libc.so显然位于/usr/lib中,但是

混乱的

编辑二:

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

也许这是我的问题。有人知道如何重写我的linker命令来解决这个问题吗

非常感谢

也许你做到了:

struct S v = { 0 };


一些编译器正在隐式地为这些东西添加内置的memset(或memcpy)。然后,内置的memset被称为_memset(在您的例子中)。链接后,如果您的libc(或在您的情况下提供标准函数的libc)没有提供链接,则会出现此链接错误。

假设您在Solaris上,您会在
libc中找到memset。因此
库:

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

只需将
-lc
添加到命令行

Memset是标准C库中的库函数。如果不使用gcc进行链接(默认情况下,gcc会将文件链接到标准库),则应将程序显式链接到libc

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

man gcc

-nodefaultlibs

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


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

使用
gcc
(或者在您的情况下使用
cc
),而不是直接尝试驱动
ld
。不幸的是,这给了我以下错误:段地址或长度“v0xfff0000000”超过内部限制如果链接多个
.o
文件以创建新的
.o
文件,则未定义的符号不应是错误。在我看来,
ld
正在尝试制作一个可执行文件…这并没有真正回答问题-OP想知道如何修复错误,即需要链接哪些特定的附加库。我回答说:“有人知道这里会发生什么吗?”谢谢你的回答,libc似乎在系统上,因此,当运行您的命令时,我将获得000310d4 T_memset。我试图将-lc标志提供给链接器,但结果有点“令人惊讶”:ld:fatal:library-lc:notfound您还必须告诉它在哪里可以找到它。将
-L/usr/lib
添加到链接器选项将此添加到命令行,错误保持不变。这里发生的事情真让人困惑…@迈克,你能用你现在使用的确切命令行更新你的问题吗?嗨,马特,刚刚用我现在使用的确切命令行更新了我的问题。希望对你有点帮助。。。
uint8_t b[100] = { 0 };
/usr/lib-> nm libc.so | grep memset
[7122]  |    201876|     104|FUNC |GLOB |0    |9      |_memset