Articles of ld

棘手的未定义的参考错误

在使用C ++在Linux中构build模块时遇到了一个棘手的“未定义引用”错误。 我将在高层描述它,并在必要时发布代码(这是专有的,所以发布它需要更改一些名称)。 一些细节: 模块A(一个库)有一个类,我们将称之为Bar的方法称为Foo。 模块A构build得很好,使用nm来查看目标文件显示构造函数和Bar都被定义(它们显示为“T”)。 模块B(一个库)包含一个使用模块A的类,引用了Foo :: Foo,Foo ::〜Foo和Foo :: Bar。 它的makefile包括-L / path / to / Foo和-lFoo。 这个模块也构build得很好。 但是,当我在模块B的目标文件上运行nm时,对模块Foo :: Foo,Foo ::〜Foo和Foo :: Bar的调用未定义(它们显示为“U”)。 为什么它构build超越了我。 模块C–其输出是一个可执行文件 – 包含对模块B的引用。当我尝试构build模块C时,它向我叫喊从模块B到模块A的Foo和Bar方法的未定义引用。 为什么模块B构build如果引用是不确定的? 为什么错误只有在我们进入模块C时才报告? 编辑: 我应该提到模块C的makefile也有-L / path / to / Foo和-lFoo,但仍然失败。 任何我应该尝试的任何高级猜测? 我有一种感觉,我将不得不张贴一些代码…

如何将Python C模块与`ld`连接起来。 对`__dso_handle'的未定义引用

我目前的命令: c++ -fPIC -c algo_cython.cpp ld -shared algo_cython.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -lc -lstdc++ -o algo_cython.so 而错误: algo_cython.o: In function `__static_initialization_and_destruction_0(int, int)': algo_cython.cpp:(.text+0x83e4): undefined reference to `__dso_handle' ld: algo_cython.o: relocation R_X86_64_PC32 against undefined hidden symbol `__dso_handle' can not be used when making a shared object ld: final link failed: Bad value

为什么不能在/etc/ld.so.conf中findpath的库?

我想将/opt/vertica/lib64到系统库path中,所以我执行以下步骤: (1)将/opt/vertica/lib64到/etc/ld.so.conf ,并运行ldconfig , (2)检查: bash# ldconfig -p | grep vertica libverticaodbc.so (libc6,x86-64) => /opt/vertica/lib64/libverticaodbc.so …… 但是当我运行“ ld -lverticaodbc –verbose ”命令时: ================================================== attempt to open /usr/x86_64-redhat-linux/lib64/libverticaodbc.so failed attempt to open /usr/x86_64-redhat-linux/lib64/libverticaodbc.a failed attempt to open /usr/local/lib64/libverticaodbc.so failed attempt to open /usr/local/lib64/libverticaodbc.a failed attempt to open /lib64/libverticaodbc.so failed attempt to open /lib64/libverticaodbc.a failed attempt to open […]

跟踪未定义的参考

我怎样才能跟踪一个未定义的参考与gcc ld ? 我已经尝试了-trace-symbol=some_ref , -trace-symbol=some_ref但是它并没有显示符号被调用的地方。 我想获得某种调用堆栈,显示为什么符号被调用的第一个地方。 所以简而言之,我需要从顶层向下追踪那个符号的所有引用。 有没有这个标志?

无法加载存储在库searchpath中的共享库

我试图执行从源代码构build的nft,但它报告 $ nft nft: error while loading shared libraries: libnftnl.so.4: cannot open shared object file: No such file or directory 我通过运行autogen.sh从源代码构buildlibmnl,libnftnl,nftables,然后使用以下命令进行configuration: –prefix=/usr/local 这些是/ usr / local / lib的内容: $ ls -l /usr/local/lib/ | grep libnftnl -rwxr-xr-x 1 root root 961 Mar 2 20:16 libnftnl.la lrwxrwxrwx 1 root root 17 Mar 2 20:16 libnftnl.so -> libnftnl.so.4.0.0 […]

使用LD将原始数据/资源链接到可执行文件

到现在为止,我一直使用MSVC ++下的资源来访问我的程序中的原始数据,而且我从来没有直接使用链接器,但是现在我在Linux下,使用交叉编译器来生成精灵文件。 我和一个朋友正在做一个玩具操作系统。 有一件事我们需要在某个时候完成,一个相当大的任意原始数据被链接到可执行文件中。 我们希望数据位于可执行文件末尾附近,并且需要能够获取指向该原始数据的指针。 可能值得注意的是GRUB在启动时将内核加载到内存中。 我们以前的想法之一就是编写一个程序来将数据转换成一个C源文件,其中数据表示为一个字节数组,但是我们认为这有点麻烦,我们宁愿直接链接它。 任何见解? 我不需要那些令人毛骨悚然的细节,只需要大致概括一下需要做什么。 我想我们可能需要对链接器脚本进行一些更改。

llvm-ld如何定位libstdc ++

简短的问题 : llvm-ld如何定位libstdc++ ? 详情 : 我收到以下错误信息: llvm-ld: error: Cannot find library 'stdc++' 同时运行llvm-ld 。 我想了解如何llvm-ldsearchlibstdc++ 。 我正在build立一个新的系统,并遵循在不同系统上工作的编译步骤。 最后,我注意到与旧系统上的.bashrc中设置的LD_LIBRARY_PATH不同,后者包含大量目录,包括Cadence和其他杂项软件。 我不想使用LD_LIBRARY_PATH ,我想通过向llvm-ld提供适当的命令行参数来链接到libstdc++ 。 我正在运行的命令是: llvm-ld -disable-internalize -native -o foo foo.bc4 -L/usr/lib/x86_64-linux-gnu -lpthread -lrt -lstdc++ -lm -v 这导致了以下输出: Linking bitcode file 'foo.bc4' Linked in file 'foo.bc4' Linking archive file '/usr/lib/x86_64-linux-gnu/libpthread.a' Linking archive file '/usr/lib/x86_64-linux-gnu/librt.a' llvm-ld: error: Cannot […]

ld链接器在创build共享目录文件时从静态库中删除目标文件

我有一些静态库,我把它们连接成一个共享库。 其中之一,比如说libUsefulFunc.a包含一个带有函数的usefulFunc.o对象文件,有用的函数(),只能从另一个静态库中使用,比如说usingFunc(),它位于使用函数libUsingFunc.a 问题是,链接器抛出有用的function,并得到错误“未定义的参考”。 我尝试了两个链接的命令。 我用我能想到的最简单的文件重新创build了这种情况: 啊 extern int foo(); AC #include "ah" int foo() { return 13; } 公元前 #include "ah" extern int b() { return print("a = %d\n", foo()); } 全部构build: gcc -c ac -o ao gcc -c bc -o bo ar q ba bo ar q aa ao ld -shared -o test.so ./ba […]

lfs glibc编译ld错误

我的主机系统是Linux debian 2.6.32-5-amd64#1 SMP Mon Feb 25 00:26:11 UTC 2013 x86_64 GNU / Linux。 我想要构build一个LFS,而glibc编译现在就停止了。 这里是错误提示,谢谢。 /mnt/lfs/sources/glibc-build/resolv/libresolv_pic.a(gethnamaddr.os):在函数`getanswer'中: /mnt/lfs/sources/glibc-2.17/resolv/gethnamaddr.c:180:未定义的引用“__stack_chk_guard” /mnt/lfs/sources/glibc-2.17/resolv/gethnamaddr.c:483:对__stack_chk_guard的未定义引用 /mnt/lfs/sources/glibc-build/resolv/libresolv_pic.a(gethnamaddr.os):函数`res_gethostbyaddr': /mnt/lfs/sources/glibc-2.17/resolv/gethnamaddr.c:644:对__stack_chk_guard的未定义引用 /mnt/lfs/sources/glibc-2.17/resolv/gethnamaddr.c:783:对`__stack_chk_guard'的未定义引用 /mnt/lfs/sources/glibc-build/resolv/libresolv_pic.a(gethnamaddr.os):在函数`__GI_res_gethostbyname2'中: /mnt/lfs/sources/glibc-2.17/resolv/gethnamaddr.c:510:对“__stack_chk_guard”的未定义引用 /mnt/lfs/sources/glibc-build/resolv/libresolv_pic.a(gethnamaddr.os):/mnt/lfs/sources/glibc-2.17/resolv/gethnamaddr.c:636:更多未定义的对__stack_chk_guard的引用 collect2:错误:ld返回1退出状态 make [2]:*** [/mnt/lfs/sources/glibc-build/resolv/libresolv.so]错误1 make [2]:离开目录`/mnt/lfs/sources/glibc-2.17/resolv' make [1]:*** [resolv / others]错误2 make [1]:离开目录`/mnt/lfs/sources/glibc-2.17' make:*** [all]错误2

在Linux上将可执行文件embedded数据时的符号名称

我需要将一些数据embedded到Linux上的可执行文件或SO文件中。 我发现我可以用ls选项 – 格式化二进制文件,但是,我所见过的所有例子都假定数据文件在当前目录中。 如果不是,那么结果符号名变得复杂,因为它试图包含文件的完整path。 有没有一种方法可以明确提供符号的名称,例如。 说这个数据的符号名称应该是MyData? 谢谢