Chr*_*vey 8 linux elf llvm ldd llvm-ir
有谁知道之前将执行哪个 LLVM IR 代码的一般规则main?
使用 Clang++ 3.6 时,似乎全局类变量的构造函数通过对象文件的“.text.startup”部分中的函数调用。例如:
define internal void @__cxx_global_var_init() section ".text.startup" {
call void @_ZN7MyClassC2Ev(%class.MyClass* @M)
ret void
}
Run Code Online (Sandbox Code Playgroud)
从这个例子中,我猜我应该寻找那些指定section ".text.startup".
我有两个理由怀疑我的理论是正确的:
我在我的 LLVM IR 文件中没有看到任何其他内容(.ll)如果我们假设 LLVM 没有嗅探 C++ 特定的函数名称,例如“__cxx_global_var_init”,那么建议首先运行全局对象构造函数。所以section ".text.startup"是唯一明显的方法说代码应该在 之前运行main()。但即使这是正确的,我们已经确定了导致函数在之前运行的充分条件main(),但没有表明这是 LLVM IR 中导致函数在 之前运行的唯一方法main()。
在某些情况下,Gnu 链接器将使用段中的第一条指令.text作为程序入口点。 这篇关于 Raspberry Pi 编程的文章描述了使.text.startup内容成为程序.text部分中出现的第一个代码体,作为使.text.startup代码首先运行的一种方式。
不幸的是,我没有找到太多其他东西来支持我的理论:
当我为字符串“.startup”grep LLVM 3.6 源代码时,我只能在 LLVM 代码的 CLang 特定部分中找到它。为了我的理论是正确的,我希望在 LLVM 代码的其他部分也能找到该字符串;特别是 C++ 前端之外的部分。
这篇关于C++ 中数据初始化的文章似乎暗示“.text.startup”具有特殊作用,但它并没有说Linux 程序加载器实际上查找该名称的一部分。即使是这样,我也会惊讶地发现一个潜在的特定于 Linux 的部分名称在平台中立的 LLVM IR 中具有特殊含义。
Linux 3.13.0 源代码似乎不包含字符串“.startup”,这表明程序加载器没有嗅探名称为“.text.startup”的部分。
答案很简单——LLVM 没有在幕后执行任何操作。在运行 main() 之前执行所有必要的准备工作是 C运行时(CRT)的一项工作。这包括(但不限于)静态 ctors 和类似的东西。运行时通常通过在特殊部分(例如 .init_array 或 .ctors)中发出的构造函数的地址来通知这些对象。有关更多信息,请参见例如http://wiki.osdev.org/Calling_Global_Constructors。
| 归档时间: |
|
| 查看次数: |
1659 次 |
| 最近记录: |