jjzjj

c++ - 目标文件 "Version References"来自哪里?

coder 2024-02-19 原文

目前我所在的目录中有一个文件 libshared-object.so(为通用起见更改了名称)。

当我运行时

$ objdump -p libshared-object.so

我收到以下输出:

libshared-object.so:     file format elf64-x86-64

Program Header:
        LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**21
                 filesz 0x00000000000828ee memsz 0x00000000000828ee flags r-x
        LOAD off    0x0000000000083768 vaddr 0x0000000000283768 paddr 0x0000000000283768 align 2**21
                 filesz 0x00000000000048e0 memsz 0x0000000000004af0 flags rw-
 DYNAMIC off    0x0000000000084af0 vaddr 0x0000000000284af0 paddr 0x0000000000284af0 align 2**3
                 filesz 0x00000000000002a0 memsz 0x00000000000002a0 flags rw-
        NOTE off    0x00000000000001c8 vaddr 0x00000000000001c8 paddr 0x00000000000001c8 align 2**2
                 filesz 0x0000000000000024 memsz 0x0000000000000024 flags r--
EH_FRAME off    0x0000000000072c6c vaddr 0x0000000000072c6c paddr 0x0000000000072c6c align 2**2
                 filesz 0x0000000000002ed4 memsz 0x0000000000002ed4 flags r--
     STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4
                 filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
     RELRO off    0x0000000000083768 vaddr 0x0000000000283768 paddr 0x0000000000283768 align 2**0
                 filesz 0x0000000000001898 memsz 0x0000000000001898 flags r--

Dynamic Section:
    NEEDED               libQt5Widgets.so.5
    NEEDED               libQt5Compositor.so.5
    NEEDED               libQt5Quick.so.5
    NEEDED               libQt5Qml.so.5
    NEEDED               libQt5Network.so.5
    NEEDED               libQt5Gui.so.5
    NEEDED               libQt5Core.so.5
    NEEDED               libGL.so.1
    NEEDED               libpthread.so.0
    NEEDED               libstdc++.so.6
    NEEDED               libm.so.6
    NEEDED               libgcc_s.so.1
    NEEDED               libc.so.6
    SONAME               libshared-object.so.1
    RPATH                /opt/qt5/lib
    INIT                 0x000000000003fc68
    FINI                 0x000000000006c234
    INIT_ARRAY           0x0000000000283768
    INIT_ARRAYSZ         0x00000000000000e8
    FINI_ARRAY           0x0000000000283850
    FINI_ARRAYSZ         0x0000000000000008
    GNU_HASH             0x00000000000001f0
    STRTAB               0x00000000000101e8
    SYMTAB               0x00000000000036d8
    STRSZ                0x0000000000022072
    SYMENT               0x0000000000000018
    PLTGOT               0x0000000000285000
    PLTRELSZ             0x0000000000008df0
    PLTREL               0x0000000000000007
    JMPREL               0x0000000000036e78
    RELA                 0x0000000000033458
    RELASZ               0x0000000000003a20
    RELAENT              0x0000000000000018
    VERNEED              0x0000000000033348
    VERNEEDNUM           0x0000000000000006
    VERSYM               0x000000000003225a
    RELACOUNT            0x0000000000000052

Version References:
    required from libm.so.6:
        0x09691a75 0x00 09 GLIBC_2.2.5
    required from libgcc_s.so.1:
        0x0b792650 0x00 08 GCC_3.0
    required from libc.so.6:
        0x06969194 0x00 10 GLIBC_2.14
        0x09691a75 0x00 07 GLIBC_2.2.5
    required from libQt5Core.so.5:
        0x00058a25 0x00 06 Qt_5
    required from libQt5Gui.so.5:
        0x0dcbd2c9 0x00 12 Qt_5_PRIVATE_API
        0x00058a25 0x00 03 Qt_5
    required from libstdc++.so.6:
        0x0bafd178 0x00 11 CXXABI_1.3.8
        0x056bafd3 0x00 05 CXXABI_1.3
        0x0297f871 0x00 04 GLIBCXX_3.4.21
        0x08922974 0x00 02 GLIBCXX_3.4

特别感兴趣的是此信息的最后版本引用:

Version References:
    required from libm.so.6:
        0x09691a75 0x00 09 GLIBC_2.2.5
    required from libgcc_s.so.1:
        0x0b792650 0x00 08 GCC_3.0
    required from libc.so.6:
        0x06969194 0x00 10 GLIBC_2.14
        0x09691a75 0x00 07 GLIBC_2.2.5
    required from libQt5Core.so.5:
        0x00058a25 0x00 06 Qt_5
    required from libQt5Gui.so.5:
        0x0dcbd2c9 0x00 12 Qt_5_PRIVATE_API
        0x00058a25 0x00 03 Qt_5
    required from libstdc++.so.6:
        0x0bafd178 0x00 11 CXXABI_1.3.8
        0x056bafd3 0x00 05 CXXABI_1.3
        0x0297f871 0x00 04 GLIBCXX_3.4.21
        0x08922974 0x00 02 GLIBCXX_3.4

问题:这些版本引用从何而来?以行 required from libQt5Gui.so.5: .. Qt_5 and Qt_5_PRIVATE_API 为例。

对版本 Qt_5Qt_5_PRIVATE_API 的引用是否来自生成 libQt5Gui.so.5 的 C 代码?或者从一些链接器选项传递给 gccld?还是来自其他?

最佳答案

Or from something else?

来自其他东西。

当您构建一个共享库(比如 libfoo.so)时,您可以(尽管不是必须)提供一个链接器版本脚本,为某些符号提供一个版本标签。

当您稍后将可执行文件或共享库(例如 libbar.so)链接到 libfoo.so 时,iff 您使用的是版本控制符号,该符号的版本标记记录在 libbar.so 中(这是您在问题中观察到的内容)。

此设置允许 libfoo.so 以 ABI 不兼容的方式更改其符号,并且仍然支持与旧符号链接(symbolic link)的旧客户端程序。

例如,x86_64 上的 libc.so.6 具有以下版本的 memcpy:

0000000000091620 g   iD  .text  000000000000003d  GLIBC_2.14  memcpy
000000000008c420 g   iD  .text  0000000000000047 (GLIBC_2.2.5) memcpy

链接到 glibc-2.13 或更早版本的程序将使用 GLIBC_2.2.5 版本,链接到 glibc-2.14 或更新版本的程序将使用 GLIBC_2.14 > 版本。

如果您尝试在具有 glibc-2.13 的系统上运行链接到 glibc-2.14 的程序,您将收到一个错误(缺少符号版本),类似于 this .

在引入符号版本控制之前,更改现有符号的 ABI 需要您发布一个完全独立的库。这称为外部库版本控制。您可以阅读更多相关信息 here .

关于c++ - 目标文件 "Version References"来自哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41061220/

有关c++ - 目标文件 "Version References"来自哪里?的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  5. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  7. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  10. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

随机推荐