根据gcc ABI 策略,gcc 4.4.7 应该依赖于libstdc++ 6.0.13。据我所知,编译器版本和 libstdc++ 版本是密切相关的,不能互换,所以我惊讶地发现以下事实:
INPUT ( -lstdc++_nonshared/usr/lib64/libstdc++.so.6 )这里发生了什么样的魔法?
具体来说:
最佳答案
What kind of magic is going on here?
这主要是 ELF 符号版本控制的魔力。我见过的最好的引用是 How to Write Shared Libraries作者 Ulrich Drepper,特别是第 3 节。
How could they provide a gcc 4.4.7 that links against an older version of libstdc++? I thought it was not possible.
libstdc++ 开发人员非常注意 ABI 兼容性。这使得查看两个不同版本的 libstdc++ 之间引入的新符号变得相当简单。
查看 libstdc++ 的 ABI compatibility page ,你可以看到 GCC 4.1 的 libstdc++ 有 GLIBCXX_3.4.8,而 GCC 4.4 的库存(FSF 版本)有 GLIBCXX_3.4.13。然后可以查看 libstdc++ version scripts查看这两个版本之间添加了哪些符号。
查看符号版本的更靠经验的方法是使用像 readelf 这样的工具。例如。在我的 Ubuntu 系统上 readelf --dyn-syms --wide/usr/lib/x86_64-linux-gnu/libstdc++.so.6 | c++filt 显示这样的输出(只是几个选定的短行):
223: 000000000006dbe0 2121 FUNC GLOBAL DEFAULT 12 std::ios_base::Init::Init()@@GLIBCXX_3.4
...
226: 00000000002ed920 1 OBJECT GLOBAL DEFAULT 27 std::adopt_lock@@GLIBCXX_3.4.11
注意符号名称末尾的符号版本,在 @@ 之后。
what is this stdc++_nonshared library?
结合上一段中的点,stdc++_nonshared 是一个静态库,它包含将在 libstdc++.so.6.0.13 中但不在 libstdc++.so.6.0.8 中的符号。
I didn't know a .so file could contain that text. Who parses it (dynamic linker I guess) and what are its specifications and consequences?
常规链接器解析它,而不是运行时链接器。请参阅 INPUT in a linker script 的 binutils 文档.因此,链接到这个特殊的 libstdc++.so.6.0.13 将导致链接器动态链接到 libstdc++.so.6.0.8,并静态链接到包含额外符号的库。
这样做的缺点是,以这种方式编译的应用程序会比动态链接到仅包含所有必要符号的库存 libstdc++.so.6.0.13 的同一应用程序更加臃肿。好处是来自较新标准库的功能可以用于旧系统的标准安装,而无需独立软件供应商提供他们自己的 libstdc++ 拷贝。
How far can this magic go? Can I use gcc4.7 with libstdc++ 6.0.3? What is the spectrum of compatibility
既然您已经知道它的魔力是什么,您可能会意识到您拥有的这个 GCC 4.4 版本是专为 Centos 5(好吧,最初是 Red Hat 5)制作的特殊版本。因此,您可能可以创建一个 GCC 4.7,它将生成只需要 libstdc++ 6.0.3 的二进制文件,但它需要大量的工作来修补您的 GCC 树以将正确的符号放入 stdc++_nonshared.a。您至少可以查看 gcc44 RPM 的源代码,了解 Red Hat 是如何做到的。
Red Hat 似乎在他们的 Red Hat Developer Toolset 中延续了这种方法。 .在撰写本文时,GCC 4.8.1 是最新的编译器,它可以为 EL5 构建二进制文件,而 EL5 仍然只需要在目标系统上安装 libstdc++.so.6.0.8。这对于想要使用 C++11 编写但需要能够在 EL5 或 EL6 上部署的开发人员来说非常有用。
关于c++ - 带有 gcc 4.4.7 的 CentOS 5.8 链接到 libstdc++ 6.0.8。这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16880830/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到