- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
环境:linux,通过 g++ 从几个 C++ 文件创建的用户空间应用程序(结果是一个 ELF)
遍历构造函数列表时出现问题(SIGSEGV)
( __CTOR_LIST__ )
(注意:通过这个列表调用的代码是对每个类的一种系统初始化, 不是我写的构造函数代码)
__CTOR_LIST__
通过GDB单步执行程序时,问题(SIGSEGV)不存在
为了调试这个,我正在寻找一种方法来添加自己的代码 before
"_do_global_ctors_aux"
有什么提示吗?
谢谢,
乌维
最佳答案
这有很多可能的原因。从您访问尚未创建的对象(因为跨不同翻译单元的对象创建顺序未定义)开始,我认为在这种情况下很可能发生这种情况,并且在您的构建环境中出现错误。
要使自己的函数在其他构造函数之前被调用,您有一个 constructor (priority)
属性描述 here . GCC 为每个文件的构造函数输入部分保留优先级。它按照这些优先级的顺序将它们链接起来。在我的 linux 系统的链接描述文件中,该代码如下所示(使用 ld -verbose
输出):
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}
你可能想给它一个低优先级,让它在其他注册的具有更高优先级的 ctor 函数之前执行。但是从它的外观来看,似乎会先执行没有编号的构造函数。完全不确定。最好你试一试。如果你想在 _do_global_ctors_aux 之前调用你的函数,你必须释放原来的 _init
函数,它通常在你的程序被 ELF 加载器加载时执行(查看 -init
ld 的选项)。自从我弄乱它已经有一段时间了,但我记得它必须做一些初始化的私密细节,所以我不会尝试替换它。尝试使用我链接到的构造函数属性。但是,要非常小心。您的代码可能会在构造其他重要对象(如 cout
)之前执行。
更新:我做了一个测试,它实际上是反向执行ctor函数。因此,先链接的 ctor 函数稍后执行。这段代码正好在gcc源码的crtstuff.c中:
func_ptr *p;
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
(*p) ();
我做了一个小测试:
void dothat() { }
struct f {
f() { dothat(); }
} f_;
void doit() __attribute__((constructor (0)));
void doit() { }
int main() { }
与 --print-map
链接产生以下输出:
.ctors 0x080494f4 0x10
*crtbegin.o(.ctors)
.ctors 0x080494f4 0x4 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/crtbegin.o
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
.ctors 0x080494f8 0x4 /tmp/ccyzWBjs.o
*(SORT(.ctors.*))
.ctors.65535 0x080494fc 0x4 /tmp/ccyzWBjs.o
*(.ctors)
.ctors 0x08049500 0x4 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/crtend.o
请注意 .ctors.65535
是我们通过属性优先级 0
隐式创建的部分。现在,如果您赋予它优先权,gcc 会发出警告,这是完全正确的:p
test.cpp:7: warning: constructor priorities from 0 to 100 are reserved for the implementation
我通过中断 doit
和 dothat
来测试它,它按照我们期望的顺序调用它们。玩得开心!
关于C++构造函数问题(linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/420350/
谁能解释一下原因: (define a (lambda() (cons a #f))) (car (a)) ==> procedure ((car (a))) ==> (procedure . #f)
这是 PyBrain 网站的摘录。我了解大部分正在发生的事情,但是一行让我完全难住了。我以前从未在 python 代码中看到过这样的东西。这是整个循环,对于上下文: for c in [0,
我是gradle / groovy的新手。我想创建将做一些事情的自定义任务。我的第一个问题是任务完成时该如何做?我可以覆盖doFirst / doLast闭包吗?也许我可以重写某些在开始和结束时都会执
我刚刚开始评估 MS 企业库。他们使用以下指令来获取实例: var customerDb = EnterpriseLibraryContainer.Current.GetInstance("C
这是我的 if else Ansible 逻辑.. - name: Check certs exist stat: path=/etc/letsencrypt/live/{{ rootDomain
我正在使用construct 2.8 对一些失传已久的 Pascal 程序创建的一些文件的 header 进行逆向工程。 header 由许多不同的记录组成,其中一些是可选的,我不确定顺序是否固定。
我在将 getchar() 的输入放入 char *arr[] 数组时遇到问题。我这样做的原因是因为输入数据(将是一个带有命令行参数的文件)将存储在一个 char 指针数组中以传递给 execvp 函
通常我们不能约束类型参数 T派生自密封类型(例如 struct 类型)。这将毫无意义,因为只有一种类型适合,因此不需要泛型。所以约束如下: where T : string 或: where T :
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
#include using namespace std; class A { private: int m_i; friend int main(int argc, char cons
这个问题在这里已经有了答案: Are there legitimate uses for JavaScript's "with" statement? (33 个答案) 关闭 9 年前。 我有这个代
在this answer我看到了下一个 Bash 结构。 yes "$(< file.txt)" 什么意思 "$(< file.txt)" ? 我明白了 命令替换 - $(command)用命令的结
if (a == 1) //do something else if (a == 2) //do something else if (a == 3) //do somethi
关于构造的快速简单的问题。 我有以下用于将项目添加到 ListView 的代码。 ListViewItem item = new ListViewItem(); item.Text = file; i
我想使用 std::vector 来控制给定的内存。首先,我很确定这不是好的做法,但好奇心占了上风,无论如何我都想知道如何做到这一点。 我遇到的问题是这样的方法: vector getRow(unsi
下面显示了一段简单的javascript: var mystring = ("random","ignored","text","h") + ("ello world") 这个字符串会生成 hello
在 Java 中,创建对象的标准方法是使用 MyClass name = new MyClass(); 我也经常看到构造 new MyClass() { /*stuff goes in here*/
我正在编写 C++ ndarray 类。我需要动态大小和编译时大小已知的数组(分别分配自由存储和分配堆栈)。我想支持从嵌套的 std::initializer_list 进行初始化。 动态大小的没问题
我正在将一个项目从 Visual Studio 2005 转换为 Visual Studio 2008,并提出了上述结构。 using Castle.Core.Resource; using Cast
我想知道我在这里的想法是否正确,我主要针对接口(interface)进行编程,所以我想知道下面的类是否应该通过 DI 注入(inject),或者我应该自己实例化一个类... 注意:这些服务保存在我的核
我是一名优秀的程序员,十分优秀!