Tag: ld

-rpath和-L有什么区别?

gcc和ld提供了许多方法来指定库的searchpath,其中包括-rpath和-L标志。 手册页显示这两个标志之间没有区别,有效地说每个标志添加一个库到库searchpath。 然而,两个国旗做的事情完全一样,这似乎很奇怪。 这两种select之间有什么区别?

编译问题:找不到crt1.o

我有一个虚拟的Debian系统,我用它来开发。 今天我想试试llvm / clang。 安装叮当之后,我无法编译我的旧c项目(与gcc)。 这是错误的: … /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 … 我卸载铛,它仍然没有工作。 有没有人有任何想法我可以解决这个问题?

如何用GCC和ld去除未使用的C / C ++符号?

我需要严格地优化我的可执行文件的大小( ARM开发),我注意到在我的当前构buildscheme( gcc + ld )中未使用的符号没有被剥离。 对于生成的可执行文件/库, arm-strip –strip-unneeded使用arm-strip –strip-unneeded不会改变可执行文件的输出大小(我不知道为什么,也许根本就不行) 。 修改我的build筑物pipe道的方式(如果存在的话)会是什么方式,以便从结果文件中去除未使用的符号? 我甚至不会想到这一点,但是我目前的embedded式环境并不是非常“强大”,即使在2M节省了500K ,也可以获得非常好的加载性能。 更新: 不幸的是,我使用的当前gcc版本没有-dead-strip选项和-ffunction-sections… + –gc-sections对于ld -ffunction-sections… + –gc-sections没有给出任何显着差异的结果输出。 我感到震惊的是,这甚至成为一个问题,因为我确信gcc + ld应该自动剥离未使用的符号(为什么他们甚至不得不保留它们?)。

LD_LIBRARY_PATH与LIBRARY_PATH

我正在构build一个简单的C ++程序,我想临时replace一个系统提供的共享库和更新的版本,用于开发和testing。 我尝试设置LD_LIBRARY_PATHvariables,但链接器(ld)失败: / usr / bin / ld:找不到-lyaml-cpp 我期望这样做,因为根据ld手册页: 链接器使用以下searchpath来查找所需的共享库:…对于本机链接器,环境variables“LD_LIBRARY_PATH”的内容… 然后我尝试设置LIBRARY_PATH,并工作。 根据GCC手册: LIBRARY_PATH的值是一个以冒号分隔的目录列表,非常像PATH。 当configuration为本机编译器时,GCC在search特殊链接器文件时尝试search指定的目录,如果找不到,则使用GCC_EXEC_PREFIX。 在使用GCC进行链接时,也会在为-l选项search普通库时使用这些目录(但使用-L指定的目录优先)。 正如(GCC)手册所build议的,LIBRARY_PATH的工作原理是因为我与GCC链接。 但.. 由于我与gcc链接,为什么ld被调用,如错误消息所示? 有两个variables用于同一目的有什么意义? 还有其他的区别吗?

.so,.la和.a库文件有什么区别?

我知道一个.so文件是一种dynamic库(大量的线程可以共享这样的库,所以不需要在内存中有多个拷贝)。 但.a和.la什么.la ? 这些都是静态库吗? 如果dynamic库比静态库有更大的优势,为什么仍然有很多静态库? 我也想知道加载库的基本机制(这两种types)以及在某个地方使用某个lib中的一段代码的方式。 我应该学习哪一部分内核? 我应该知道什么相关的Linux命令/实用程序才能知道进程是如何运行的? (我现在只知道ld命令) 什么时候应该尝试将代码构build到.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 […]

从内存中删除?

我正在寻找一种方法来直接从内存中加载生成的对象代码。 我明白,如果我把它写到一个文件中,我可以调用dlopendynamic加载它的符号并链接它们。 然而,这看起来有点迂回,考虑到它在内存中启动,写入磁盘,然后通过dlopen重新加载到内存中。 我想知道是否有一些方法来dynamic链接目标代码存在于内存中。 从我可以告诉的可能有几种不同的方式来做到这一点: 把它想成你的内存位置是一个文件,尽pipe它永远不会留下内存。 find一些其他的系统调用,我正在寻找(我不认为这存在)。 find一些可以直接在内存中链接代码的dynamic链接库。 很明显,这对于google来说有点难,因为“dynamic链接库”提供了关于如何dynamic链接库的信息,而不是dynamic链接任务的库。 从链接器中抽取一些API,并从其代码库中创build一个新的库。 (显然这对我来说是最不可取的select)。 那么哪些是可能的? 可行? 你能指出我所假设的任何东西吗? 还有没有想过的另一种方式?

为什么我得到一个gcc“未定义的引用”错误试图创build共享对象?

为什么使用gcc得到“未定义参考”错误? 我正在尝试创build一个导出一个函数“external()”的共享对象(.so)。 然后我尝试链接到.so,但得到“未定义参考”外部“”。 我在这里做错了什么? 文件:external.c int external() { return 5; } 文件:program.c int external(); int main(char** argv, int* argc) { return external(); } 命令: $ gcc -fPIC -c external.c $ gcc -shared -o libexternal.so external.o $ gcc -L. -lexternal -o program program.c /tmp/cc3MmhAE.o: In function `main': program.c:(.text+0x7): undefined reference to `external' collect2: ld returned 1 […]

如何打印ld(链接器)searchpath

打印ld所search的searchpath的方法是什么?

将两个GCC编译的.o目标文件组合成第三个.o文件

如何将两个GCC编译的.o目标文件合并到第三个.o文件中? $ gcc -c ac -o ao $ gcc -c bc -o bo $ ??? ao bo -o co $ gcc co other.o -o executable 如果有权访问源文件, -combine GCC标志将在编译之前合并源文件: $ gcc -c -combine ac bc -o co 但是,这只适用于源文件,并且GCC不接受.o文件作为此命令的input。 通常情况下,链接.o文件无法正常工作,因为您无法使用链接器的输出作为input。 结果是一个共享库,并没有静态链接到生成的可执行文件。 $ gcc -shared ao bo -o co $ gcc co other.o -o executable $ ./executable ./executable: […]

我不明白-Wl,-rpath -Wl,

为了方便起见,我在下面添加了相关的手册页。 我的(误)理解第一:如果我需要与选项分开,这意味着第二个-Wl不是另一个选项,因为它来之前,这意味着它是一个参数-rpath选项。 我不明白-rpath怎么可能有一个-Wl,. 论据! 在我脑海中,有什么是有道理的: -Wl,-rpath . 这应该使用当前目录参数调用-rpath链接器选项。 man gcc: 轮候册,选项 将选项作为选项传递给链接器。 如果选项包含逗号,则在逗号处将其拆分为多个选项。 您可以使用此语法将parameter passing给选项。 例如, -Wl,-Map,output.map将-Map output.map传递给链接器。 在使用GNU链接器的时候,你也可以用`-Wl,-Map = output.map'获得同样的效果。 男人ld: -rpath = DIR 将目录添加到运行时库searchpath。 链接ELF可执行文件和共享对象时使用。 所有-rpath参数连接在一起并传递给运行时链接程序,该链接程序使用它们在运行时定位共享对象。 查找明确包含在链接中的共享对象所需的共享对象时,也使用-rpath选项;