我想创建一个使用来自第 3 方静态库的函数的共享库。例如,libfoobar.a 中的 foo 和 bar。我知道我的主应用程序也在使用 foo 并将导出该符号。所以我只是想在 bar 中链接以节省代码大小并保留“foo”未解析(因为它将由主应用程序提供)。如果我包含 libfoobar.a,链接器 ld 将在我的共享库中包含这两个函数。如果我不包含 libfoobar.a,我的库将无法访问函数 bar,因为应用程序本身没有链接到 bar。问题:
libfoobar.a 变成共享库?libfoobar.a 中提取包含函数 bar 的文件并在链接器行上指定?bar,因此不会加载共享库中 bar 的副本? 最佳答案
以下几点试图回答我提出的问题:
--just-symbols 或 --undefined(或 EXTERN 链接器脚本命令)不会阻止 ld 链接符号。将静态库 libfoobar.a 转换为共享库 libfoobar.so.1.0,并导出所有可见符号。您还可以使用 --version-script 和其他方法来仅导出符号的子集。
ld -shared -soname libfoobar.so.1 -o libfoobar.so.1.0 --whole-archive libfoobar.a --no-whole-archive
最好从静态库的副本中删除存档成员,而不是提取它们,因为可能存在您必须管理的内部依赖关系.例如,假设您要导出所有符号,您可以从主可执行文件生成一个映射文件。然后,您可以 grep 查找可执行文件从静态库副本中提取的所有存档成员,并将它们从副本中删除。因此,当您的 DSO 在静态库中进行链接时,它会留下未解析的相同符号。
如果您使用 --pie 选项编译可执行文件,则可以将您的主要可执行文件指定为 DSO 的共享库。如果在链接命令中它位于静态库之前,您的 DSO 将首先链接到您的可执行文件。需要注意的是,主要可执行文件必须通过 LD_LIBRARY_PATH 或 -rpath 可用。此外,使用 strace 表明,由于可执行文件是您的库的依赖项,因此当您的 DSO 加载时它会再次加载。
ld -shared -rpath '$ORIGIN' -L。 -lc -ldl -o DSO.so DSO.o app libfoobar.a
除非您使用RTLD_DEEPBIND 标志调用dlopen(),否则动态链接器将首先使用foo 的可执行版本。使用 strace 显示整个 DSO 是文件映射 mmap2() 到内存中。但是,维基百科声称对于 mmap,“在访问特定位置后,磁盘的实际读取是以“惰性”方式执行的。”如果这是真的,那么重复的 foo 将不会被加载。请注意,仅当您的 DSO 导出函数 foo 时才会发生覆盖。否则,只要您的 DSO 调用 foo,就会使用静态链接到您的 DSO 的函数 foo。
总而言之,如果 mmap() 使用惰性读取,那么最好的解决方案是以正常方式链接您的 DSO,让动态链接器和 linux 处理其余部分。
关于linux - 共享库中库函数的选择性静态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1847883/
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我需要一个通过输入字符串进行计算的方法,像这样function="(a/b)*100"a=25b=50function.something>>50有什么方法吗? 最佳答案 您可以使用instance_eval:function="(a/b)*100"a=25.0b=50instance_evalfunction#=>50.0请注意,使用eval本质上是不安全的,尤其是当您使用外部输入时,因为它可能包含注入(inject)的恶意代码。另请注意,a设置为25.0而不是25,因为如果它是整数a/b将导致0(整数)。
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模