Tag: 链接器

使用FFI声明时GHCi运行时链接程序问题

我对Haskell的FFI和GHC的交互模式有一个问题。 考虑FFISo.hs : {-# LANGUAGE OverloadedStrings #-} module Main where import qualified Data.ByteString.Char8 as B import FFIFun.Foo main :: IO () main = do B.putStrLn "main" callMeFromC callMeFromHaskell return () cc : #include <stdio.h> void callMeFromC(void); void callMeFromHaskell(void) { printf("callMeFromHaskell\n"); callMeFromC(); } FFIFun/Foo.hs : {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ForeignFunctionInterface #-} module FFIFun.Foo where […]

如何添加include和libpath来configuration/ make循环?

我需要一个地方来安装库,我没有su访问Linux的框。 我正在使用〜/ local [/ bin,/ lib,/ include],但我不知道如何告诉./configure在那里寻找库(特别是,我试图编译emacs,需要libgif ,这不是在我的发行版中)。 我尝试添加 export PATH=$PATH:~/local/bin export LD_LIBRARY_PATH=~/local/lib export C_INCLUDE_PATH=~/local/include export CPLUS_INCLUDE_PATH=~/local/include 到.bashrc但它似乎不工作。

什么是静态库的.lib文件,静态链接的dynamic库和dynamic链接的dynamic库?

什么是静态库的.lib文件,静态链接的dynamic库和dynamic链接的dynamic库? 如何在dynamic链接的dynamic库中不需要.lib文件,而且在静态链接中,.lib文件不过是包含所有方法的.obj文件。 那是对的吗?

用黄金取代ld – 任何经验?

有没有人试图用gold而不是ld ? gold 承诺要比ld快得多,所以它可能有助于加快大型C ++应用程序的testing周期,但是可以用它作为ld的替代品吗? gcc / g++直接调用gold 。 有没有知道的错误或问题? 虽然gold自一段时间以来就是GNU binutils的一部分,但我几乎没有发现Web上的“成功故事”,甚至“Howtos”。 ( 更新:添加链接黄金和博客条目解释 )

我怎么能从一个.map文件graphics显示内存布局?

我的gcc构build工具链生成一个.map文件。 如何以graphics方式显示内存映射?

linuxdynamic连接器的“无版本信息”错误是什么意思?

在我们的产品中,我们提供了一些dynamic链接到像“libpam”这样的系统库的linux二进制文件。 在某些客户系统上,当程序运行时,我们在stderr上得到以下错误: ./authpam: /lib/libpam.so.0: no version information available (required by authpam) 应用程序运行正常,并执行dynamic库中的代码。 所以这不是一个致命的错误,它只是一个警告。 我认为这是错误来自dynamic链接器,当系统安装库缺less我们的可执行文件预期的东西。 我对dynamic链接过程的内部知识并不了解,并且使用这个主题search并没有什么帮助。 🙁 任何人知道是什么原因造成这个错 …我如何诊断原因? …以及我们如何改变我们的可执行文件,以避免这个问题? 更新:客户升级到最新版本的debian“testing”,发生同样的错误。 所以这不是一个过时的libpam库。 我想我想了解链接器在抱怨什么? 我如何调查潜在的原因等?

-rpath和-L有什么区别?

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

OS X上的弱符号别名与Linux上的符号别名类似,还是最近似的?

我做的事 在为Linux编写共享库时,我倾向于注意重定位,符号可见性,GOT / PLT等。 适用时,我试图避免在同一个库中的函数互相调用时调用PLT存根。 例如,假设一个共享对象提供了两个公共函数foo()和bar() (这两个函数都可以被用户调用)。 bar()函数也会调用foo() 。 所以我在这种情况下做的是这样的: 定义具有私有可见性的_foo()和_bar()函数。 分别为_foo()和_bar()定义foo()和bar()弱别名。 这样,共享对象中的代码就不会使用弱符号。 它只直接调用本地函数。 例如,当_bar()被调用时,它直接调用_foo() 。 但用户不知道_*函数,并始终使用相应的弱别名。 我怎么做 在Linux中,这是通过使用以下结构来实现的: extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME")); 问题 不幸的是,这不适用于OS X.我对OS X或其二进制格式没有深入的了解,所以我探索了一下,发现了一些弱函数的例子(比如这个 ),但是这些并不完全就像你可以有一个弱符号一样,但不是一个弱符号,它是DSO本地函数的别名。 可能的解决… 现在,我刚刚禁用了这个function(使用macros实现),以便所有符号都是全局符号,并具有默认的可见性。 我现在能想到的唯一方法就是让所有的_foo函数具有私有的可见性,并具有相应的具有默认可见性的foo函数,并调用它们的“隐藏”对应函数。 更好的方法? 然而,这需要改变很多代码。 所以我宁愿不去那里,除非没有别的办法。 那么什么是closuresOS X的select或最简单的方法来获得相同的语义/行为?

容易检查共享库中的未解决的符号?

我正在编写一个相当大的C ++共享对象库,并遇到一个小问题,使debugging变得很痛苦: 如果我在头文件中定义一个函数/方法,而忘记为它创build一个存根(在开发过程中),因为我正在构build一个共享对象库而不是一个可执行文件,所以编译时不会出现错误,告诉我我有忘记执行该function。 我发现错误的唯一方法是在运行时,最终一个链接到这个库的应用程序会因为'未定义的符号'错误而崩溃。 我正在寻找一种简单的方法来检查编译时是否有所需的所有符号,也许我可以将其添加到我的Makefile中。 我提出的一个解决scheme是通过nm -C -U运行编译的库,以获取所有未定义引用的demangled列表。 问题是这也出现在其他库中的所有引用的列表,如GLibC,当最终应用程序放在一起时,这些链接当然会与这个库链接。 有可能使用nm的输出grep通过我所有的头文件,看看是否有任何相应的名称..但这似乎是疯了。 这当然不是一个不常见的问题,有更好的解决办法吗?

重复的符号问题

在一个iOS项目的重构过程中,我遇到了这个bug。 在链接阶段,我得到这个消息: ld:/path/to/TinCanViewController-E98A666B7AF2673A.o中的重复符号_OBJC_IVAR _ $ _ TinCanViewController.currentViewController和/path/to/TinCanViewController-E98A666B7AF2673A.o 据我所知,它看起来像它声称TinCanViewController-E98A666B7AF2673A.o宣布指定的符号两次; 两个path都指向完全相同的.o文件。 我在那个特定的文件上运行nm ,它只包含那个符号一次: 00008150 S _OBJC_IVAR _ $ _ TinCanViewController.currentViewController 我在目录中的所有其他.o文件上运行nm ,看它们是否以某种方式声明了这个符号,但是它们不是。 这发生在我添加到TinCanViewController类的任何成员 – 它不是特定于currentViewController。 我觉得我必须以某种方式与某个class级进行两次连接,但是我非常努力地去了解并检查了这个class级的所有参考资料。 在重构版本中,基本上没有。 AppDelegate包含它,但现在它基本上只是一个直通类,在开始时加载另一个ViewController。 项目中没有其他课程包括它。 有什么build议可能会导致这一点,或者我可能会更好地debugging它?