如何查找在c ++ main之前调用的代码功能

问题描述 投票:4回答:4

如何查找在c ++ main之前调用的代码功能?我试图找到要调用哪些函数以便通过函数初始化静态变量,从而在main之前执行该函数。

c++
4个回答
3
投票

在海湾合作委员会的情况下,您有:

__CTOR_LIST__ (list of initialization functions called - pointers) 
__DTOR_LIST__ (list of functions called for cleanup)

它们由编译器为每个翻译单元(C / C ++文件)自动生成。

您可以找到有关此here的更多信息。对于其他编译器,这必须类似,但是您可以使用objdumpnm之类的工具(当然,对于您的编译器套件)来“猜测”它。

我们在使用g ++的自定义嵌入式平台上手动调用了这些指针函数(void(* func)(void))。


我发现您对查找静态/全局变量感兴趣。

对于此任务,您可以真正使用objdump和nm之类的工具(前面已提到)。首先创建2-3个测试文件(并编译它们以获得.o / .obj),然后查看这些工具如何查看静态/全局变量(在.obj / .o文件中。一旦看到,您可以使用脚本浏览所有.obj / .o文件,并列出静态/全局变量的列表。


2
投票

这是极其特定于编译器和/或平台的。实际上,我只是花了一天的大部分时间来研究两个不同编译器处理此问题的方式之间的不兼容性。


2
投票

运行时的最佳方法是为C ++运行时查找启动文件。这是在main之前执行的代码。它负责系统初始化,包括初始化内存,静态变量和调用全局对象的构造函数。在MS VC ++中,此文件为crt0.c。您可以通过在main处设置一个断点,然后查看堆栈跟踪来找到它。


0
投票

过去,现在从C ++项目的第一天开始,我所做的就是删除所有全局变量。此时的唯一方法是使用可以从main()调用的初始化函数来创建所有内容(当然,强烈建议您通过创建许多不同的初始化函数来分解初始化过程,实际上强烈建议这样做。)

© www.soinside.com 2019 - 2024. All rights reserved.