gcc给linux ELF添加了哪些功能?

2024-01-03

当用 c(或 asm)链接一个类似 helloworld 的程序时gcc它会将一些内容添加到结果可执行目标文件中。我只知道运行时动态链接器和_start但这些添加的功能是什么样的入口点呢?

00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones
0000000000400470 t __do_global_dtors_aux
0000000000400490 t frame_dummy
00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini
0000000000400554 T _fini
0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start
0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end

它们是什么以及有什么用?有在某处描述过吗?谷歌搜索没有帮助。


其中大多数是在“主”程序本身之前或之后执行代码的各种方法,并且大多数存在于crtstuff.c ( https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c)。 它们的存在是为了支持各种类 C 编程语言的功能,但也可以在 C 中访问它们。它可能看起来过于复杂,因为其中一些代表遗留包袱,一些代表支持 GCC 运行的各种不同架构所需的变体。

 

从您的列表中,一一(或二二):

00000000004003f0 t deregister_tm_clones
0000000000400430 t register_tm_clones

事务内存旨在使线程编程变得更简单。 它是基于锁的同步的替代方案。 这些例程分别拆除和设置支持这些函数的库 (libitm) 使用的表。 有关 TM 的更多信息请点击此处https://gcc.gnu.org/wiki/TransactionalMemory https://gcc.gnu.org/wiki/TransactionalMemory和这里http://pmarlier.free.fr/gcc-tm-tut.html http://pmarlier.free.fr/gcc-tm-tut.html

 

0000000000400470 t __do_global_dtors_aux

在系统上退出程序时运行所有全局析构函数.fini_array不可用。

 

0000000000400490 t frame_dummy

该函数位于.init部分。它被定义为void frame_dummy ( void )生命的全部意义就是呼唤__register_frame_info_bases其中有参数。显然调用带有参数的函数.init部分可能不可靠,因此这个函数所以__register_frame_info_bases不会直接从.init section. The .eh_frame信息库用于异常处理和类似的功能(例如用__attribute__((cleanup(..)))).

 

00000000004004e0 T __libc_csu_init
0000000000400550 T __libc_csu_fini

它们运行任何程序级初始化程序和终结程序(有点像整个程序的构造函数/析构函数)。 如果您定义如下函数:

void __attribute__ ((constructor)) mefirst () {
    /* ... do something here ... */
}

void __attribute__ ((destructor)) melast () {
    /* ... do something here ... */
}

他们将在之前和之后被调用main()分别通过这些例程。 也可以看看https://gcc.gnu.org/onlinedocs/gccint/Initialization.html https://gcc.gnu.org/onlinedocs/gccint/Initialization.html

 

0000000000400554 T _fini

这是一种现已弃用的运行程序级(实际上是对象文件级)析构函数的方法(有关这方面的一些信息可以在man dlclose)。 构造函数相应的过时函数是__init.

 

0000000000600668 t __frame_dummy_init_array_entry
0000000000600668 t __init_array_start

这些标志着整个过程的结束和开始.init_array部分,其中包含指向所有程序级初始值设定项的指针(请参阅__libc_csu_init above).

 

0000000000600670 t __do_global_dtors_aux_fini_array_entry
0000000000600670 t __init_array_end

这些标志着整个过程的结束和开始.fini_array部分,其中包含指向所有程序级终结器的指针(请参阅__libc_csu_fini above).

 

[EDIT]一些附加说明:

  • 链接http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html(回程机) https://web.archive.org/web/20191210114310/http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html来自杰斯特的问题评论包含一个漂亮的图表和一个小样本 程序说明了这些东西运行的总体顺序以及如何运行 从 C 访问其中一些功能。

  • 条款 'ctors' and 'dtors' 是缩写 '构造函数' and '析构函数' 分别。

  • 全局构造函数/析构函数和对象文件之间的区别 当你的程序是这样的时候,构造函数/析构函数是最明显的 由多个目标文件构建。

  • 标记为 ' 的符号T' (__libc_csu_init、__libc_csu_fini、_fini) 是“全局”(外部可见),其余部分(标记为 't') 不是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc给linux ELF添加了哪些功能? 的相关文章

随机推荐

  • Rgb、Rgba、Hsl、Hsla 颜色编码的正则表达式模式

    我正在寻找这种字符串的正则表达式 rgb r g b rgba r g b a hsl h s l hsla h s l a with r g b integer included between 0 and 255 a float bet
  • TFS 将特定版本获取到单独的文件夹中

    我目前正在开发一个使用 TFS 源代码控制的项目 我们刚刚收到了旧版本代码的错误报告 我需要下载该版本的代码来测试它 我的第一个想法是 获取特定版本 来提取代码 但我不想将该版本放入我当前的工作区目录中 有没有一种简单的方法可以将 获取特定
  • 如何在android中建立UDP连接

    我正在尝试在我的之间建立联系galaxy tab and my laptop 因此 我尝试在笔记本电脑上运行服务器活动 在选项卡上运行客户端活动 但它不起作用 这是服务器和客户端代码 错误在哪里 SERVER public class Ma
  • 正则表达式匹配所有 \p{L} 但不匹配 \p{Alpha}

    我怎样才能匹配所有 p L 但不是 p Alpha 在正则表达式中 是否可以实现一个逻辑AND在 Java 正则表达式中 如果答案是肯定的 那么如何实现呢 是的 通过使用否定字符类 http www regular expressions
  • C++:避免​​重复符号链接器错误

    我收到链接器错误 duplicate symbol ZN5ENDF64FileILNS 7MF enumE1EE4readEv in Read cpp o Material cpp o 其中重复的符号名称是 c filt ZN5ENDF64
  • 错误:找不到与给定名称匹配的资源(在“主题”处,值为“@style/AppTheme”)

    给我错误 我尝试了一切 2014 11 15 17 56 06 登录活动 C Users Different workspace LoginActivity AndroidManifest xml 15 错误 错误 找不到与给定名称匹配的资
  • 使用附加变换对同级元素进行风格化

    我一直在努力实现以下目标 而不必声明所有nth of type x li nth of type 2 transform scale 0 9 li nth of type 3 transform scale 0 81 li nth of t
  • Hibernate实体扩展基类,为实体形成的表没有基类中的属性列

    public class BaseEntity Column private String author public BaseEntity String author this author author public String ge
  • “pre”和“post”删除未触发的中间件

    我已经实现了两种不同的方法来删除用户 并且没有一种方法触发 预 和 后 删除中间件 我认为 以下是我的模型文件中的两种不同实现 方法一 var User module exports mongoose model User userSche
  • 向 PostgreSQL 数据库的所有架构中的表添加列

    我有一个 Postgres 8 4 架构 如下所示 My Database gt Schemas gt AccountA gt AccountB gt AccountC gt AccountD gt AccountE gt AccountZ
  • Spring Boot 2.Hikari连接池优化

    我有一个 SpringBoot 应用程序 我正在控制器中进行一些性能测试 我意识到无论我放入控制器的第一个查询是什么 与其他查询相比都需要很长时间 数据库是远程连接 但我无法改变这一点 long t1 System nanoTime men
  • 如何将 YouTube API 持续时间转换为秒? [复制]

    这个问题在这里已经有答案了 为了兴趣 我想转换 YouTube 的视频时长ISO 8601到秒 为了将来证明我的解决方案 我选择了一个很长的视频 http www youtube com watch v 2XwmldWC Ls来测试它 AP
  • 使用 useState React hook 时从状态获取空数据

    我偶然发现了 useState 范围的问题 我正在尝试创建一个动态引导表单 用户可以在其中向组添加更多行 这些行将包含与能源相关的数据 因此 当我添加 2 行并开始更改输入值时 输入环境数据函数触发空数据 最后一个console log 我
  • Node js 对象导出

    有一个非常简单的问题 我找不到关于从 Node js 中的模块导出对象的答案 更具体地说是访问对象属性 这是我导出的对象 exports caravan month july 这是我的主要模块 var caravan require car
  • Invoke-Command 和直接查询的区别

    我目前正在编写一个从服务器查询磁盘信息的脚本 我遇到了一个问题 我真的不知道这里发生了什么 愿你能帮助我 以下代码有效 已替换 ComputerName space1 Invoke Command ComputerName xxxxxx S
  • 测试值是否存在于多个列表中

    我想检查每个列表中是否存在某个值 以下返回True正如预期的那样 但似乎不符合Python风格 正确 更优雅的方法是什么 a 1 2 b 1 3 c 1 4 d 2 5 False in True if 1 in l else False
  • iOS 8.3 打破了自动单元格高度

    长期读者 第一次海报 我在我的应用程序中使用自动单元格高度和自动布局 在 iOS 8 3 和 8 4 中 这一点似乎被打破了 我有一个示例项目 当内置于 8 2 或更低版本时 它可以正常工作 单元格高度由自动布局确定 当内置于 8 3 或
  • PHP gettext() 挪威语

    我正在使用 PHPgettext 简单地将网站转换为其他语言 到目前为止 该解决方案运行良好 英语 匈牙利语 因为我需要将挪威语翻译添加到新网站 当我设置挪威语言环境时setlocale LC ALL nb NO ISO8859 1 get
  • 更改条形图中条形的宽度 (R)

    我想知道如何更改 barchart 函数中条形的宽度 这是代码 rater1 lt c 0 75 0 66 0 73 0 63 barplot rater1 ylim c 0 1 axes TRUE names arg c A B C D
  • gcc给linux ELF添加了哪些功能?

    当用 c 或 asm 链接一个类似 helloworld 的程序时gcc它会将一些内容添加到结果可执行目标文件中 我只知道运行时动态链接器和 start但这些添加的功能是什么样的入口点呢 00000000004003f0 t deregis