Questions tagged «ld»

ld(链接程序或加载程序)程序将目标文件,归档文件和共享库(来自的引用)组合在一起,将其数据和地址与符号引用一起重新放置。链接通常是编译程序的最后一步。

4
我不明白-Wl,-rpath -Wl,
为了方便起见,我在下面添加了相关的联机帮助页。 我的(误)理解是:如果需要用来分隔选项,,则意味着第二个-Wl不是另一个选项,因为它先,于该-rpath选项,这意味着它是该选项的参数。 我不明白怎么-rpath能有一个-Wl,.说法! 在我看来有意义的是: -Wl,-rpath . 这应该使用当前目录参数调用-rpath链接器选项。 man gcc: -Wl,选项 通过选项作为链接器的选项。如果option包含逗号,则会在逗号处将其拆分为多个选项。您可以使用此语法将参数传递给选项。例如,-Wl,-Map,output.map传递 -Map output.map给链接器。使用GNU链接器时,您也可以通过`-Wl,-Map = output.map'获得相同的效果。 人ld: -rpath = dir 将目录添加到运行时库搜索路径。在将ELF可执行文件与共享库链接时使用。所有-rpath参数都被串联并传递到运行时链接程序,该链接程序使用它们在运行时定位共享对象。在查找链接中显式包含的共享库所需的共享库时,也使用-rpath选项。
244 gcc  ld  rpath 

1
.so,.la和.a库文件有什么区别?
我知道.so文件是一种动态库(很多线程可以共享这样的库,因此在内存中不需要多个副本)。但是.a和之间有什么区别.la?这些都是静态库吗? 如果动态库比静态库具有很大的优势,那么为什么仍然有很多静态库? 我还想知道加载库(两种)的基本机制,以及在某处使用lib时如何调用一段代码。我应该学习内核的哪一部分?我应该了解什么相关的Linux命令/实用程序才能知道进程如何运行?(我现在只知道ld命令) 什么时候应该尝试将代码内置到.so或中.a?哪一个更好? [mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l total 96 -rw-r--r-- 1 mirror mirror 22892 Sep 2 23:25 openvpn-plugin-auth-pam.a -rwxr-xr-x 1 mirror mirror 931 Sep 2 23:25 openvpn-plugin-auth-pam.la -rwxr-xr-x 1 mirror mirror 23621 Sep 2 23:25 openvpn-plugin-auth-pam.so -rw-r--r-- 1 mirror mirror 17228 Sep 2 23:25 openvpn-plugin-down-root.a -rwxr-xr-x 1 mirror …

3
LD_LIBRARY_PATH和LIBRARY_PATH
我正在构建一个简单的C ++程序,我想用它的最新版本临时替换系统提供的共享库,以进行开发和测试。 我尝试设置LD_LIBRARY_PATH变量,但链接器(ld)失败,并显示以下信息: / usr / bin / ld:找不到-lyaml-cpp 我期望它能工作,因为根据ld手册页: 链接器使用以下搜索路径来查找所需的共享库:...对于本机链接器,环境变量“ LD_LIBRARY_PATH”的内容... 然后,我尝试设置LIBRARY_PATH,并且有效。 根据GCC手册: LIBRARY_PATH的值是用冒号分隔的目录列表,非常类似于PATH。当配置为本地编译器时,如果无法使用GCC_EXEC_PREFIX找到特殊的链接器文件,则GCC会尝试搜索指定的目录。当在普通库中搜索-l选项时,使用GCC链接也会使用这些目录(但使用-L指定的目录排在最前面)。 正如(GCC)手册所建议的,LIBRARY_PATH可以工作,因为我与GCC链接。 但.. 由于我与gcc链接,为什么错误消息提示为什么调用ld? 具有两个目的相同的变量有什么意义?还有其他区别吗?
159 gcc  g++  ld 


17
编译问题:找不到crt1.o
我有一个用于开发的虚拟Debian系统。 今天,我想尝试llvm / clang。 安装clang后,我无法使用gcc编译旧的c项目。这是错误: ... /usr/bin/ld: cannot find crt1.o: No such file or directory /usr/bin/ld: cannot find crti.o: No such file or directory collect2: ld returned 1 exit status ... 我卸载了clang,但仍然无法正常工作。 有谁知道我该如何解决?
114 gcc  clang  ld 

11
如何使用GCC和ld删除未使用的C / C ++符号?
我需要严格优化可执行文件的大小(ARM开发),并且我注意到在我当前的构建方案(gcc+ ld)中,未使用的符号没有被剥离。 arm-strip --strip-unneeded所产生的可执行文件/库的用法不会更改可执行文件的输出大小(我不知道为什么,也许根本无法更改)。 修改我的构建管道的方式(如果存在)是什么,以便从生成的文件中删除未使用的符号? 我什至不会想到这一点,但是我当前的嵌入式环境不是非常“强大”,并且甚至节省500K了2M结果,从而极大地提高了加载性能。 更新: 不幸的是,目前的gcc版本我使用不具备-dead-strip选项和-ffunction-sections... + --gc-sections用于ld没有给出结果输出任何显著差异。 我感到震惊的是,这甚至成为了问题,因为我确定gcc + ld应该自动剥离未使用的符号(为什么还要保留它们?)。
110 c++  c  gcc  ld  strip 

1
-rpath和-L有什么区别?
gcc并ld提供了多种方法来指定库的搜索路径--rpath和-L标志。手册页没有显示这两个标志之间的差异,实际上是说每个标志都在库搜索路径中添加了一个库。但是,两个标志都做完全相同的事情似乎很奇怪。这两个选项之间有什么区别(如果有)?

2
将两个GCC编译的.o目标文件合并为第三个.o文件
一个人如何将两个由GCC编译的.o目标文件组合到第三个.o文件中? $ gcc -c a.c -o a.o $ gcc -c b.c -o b.o $ ??? a.o b.o -o c.o $ gcc c.o other.o -o executable 如果您有权访问源文件,则-combineGCC标志将在编译之前合并源文件: $ gcc -c -combine a.c b.c -o c.o 但是,这仅适用于源文件,GCC不接受.o文件作为此命令的输入。 通常,链接.o文件无法正常工作,因为您无法使用链接器的输出作为输入。结果是一个共享库,并且没有静态链接到生成的可执行文件中。 $ gcc -shared a.o b.o -o c.o $ gcc c.o other.o -o executable $ …


3
为什么gcc中'-l'选项的顺序很重要?[重复]
这个问题已经在这里有了答案: 为什么链接库的顺序有时会导致GCC错误? (9个答案) 上个月关闭。 我正在尝试编译一个使用udis86库的程序。实际上,我正在使用库用户手册中给出的示例程序。但是在编译时会产生错误。我得到的错误是: example.c:(.text+0x7): undefined reference to 'ud_init' example.c:(.text+0x7): undefined reference to 'ud_set_input_file' . . example.c:(.text+0x7): undefined reference to 'ud_insn_asm' 我正在使用的命令是: $ gcc -ludis86 example.c -o example 按照用户手册中的指示。 显然,链接器无法链接libudis库。但是,如果我将命令更改为: $ gcc example.c -ludis86 -o example 它开始工作。因此,请有人解释第一个命令的问题是什么?
72 c  gcc  linker  ld 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.