如何比任何其他全局或静态变量更早地创建/构造类实例?

Rob*_*min 7 c++ linux

如何在main()之前创建特定类的实例,早于任何其他实例(包括静态和全局变量,包括静态和动态库(包括第三方提供的库))?


我正在处理一个具有许多类的项目,这些类在构造期间可能会导致错误,例如访问NULL指针.任何此类错误都会导致信号发送到应用程序.我有一个信号处理程序捕获信号,显示违规线程的堆栈跟踪,并调用默认信号处理程序,导致生成核心转储等.
但是,一些此类错误导致的实例被创建为全局变量和类的静态变量.即它们被构造并导致比main()更早的信号输入.

为了捕获这样的信号,我需要在main()之前注册我的信号处理程序,即我需要创建一个实例(它将注册信号处理程序)也作为全局或类静态变量,我需要保证这样早于任何其他实例创建/构造实例.

怎么做到这一点?


要注册信号处理程序,我使用sigaction().
为了显示堆栈跟踪,我使用了backtrace(),backtrace_symbols(),abi :: __ cxa_demangle().

Ser*_*rge 2

调用静态构造函数的顺序取决于它们在源文件中的顺序、链接顺序和加载共享库的顺序。执行所需操作的通常方法是使用注册函数创建一个单独的文件,并确保相应的对象在链接器命令行中显示为第一个对象。它应该是任何共享或静态库的一部分。

即第一个.c

static int first_function() {
    // register your signals
    ...
    return 0;
}
static int status = first_function();


gcc -c first.c -o first.o
gcc -o myexec first.o ... all other files
Run Code Online (Sandbox Code Playgroud)