所以我有一个构建和运行良好的应用程序。我开始在它链接到的 20 多个静态和动态库上使用一些编译器设置,并且应用程序在特定点启动时始终崩溃。
我恢复了我的构建系统模块,并且该应用程序再次正常。(但是,我忘记记下我实际所做的更改......)
纯粹出于兴趣,因为我仍然有一个坏二进制文件的副本(在调试模式下构建),我想尝试对我所做的事情进行逆向工程以搞砸事情。:-)
附加一个调试器,我可以看到 a 中的一个函数.so
通过函数调用传递给主应用程序,主应用程序的函数指针用作回调。
在调用者的框架中(在 中.so
),函数指针有一个值。在被调用者的框架中(在主应用程序中),函数指针神奇地具有不同的值。
当主应用程序尝试调用存储的函数指针时,程序会因段错误(映射器错误)而崩溃。函数指针似乎仍然有第二个值,这可能是错误的。
关于如何挑选这个有什么建议吗?
更新:根据要求提供更多详细信息。
崩溃发生在:
0xfffffffffffeac58 ???????? ()
0x000000000063a040 app_exec_callbacks()
0xfffffd7ffea14514 dynlib_stuff ()
0x000000000063a15e other_app_stuff ()
0x00000000004d10a3 app_stuff ()
0x0000000000499f20 main ()
在此之前,该函数dynlib_do_setup()
通过对 的调用将函数指针 ( of dynlib_callback_handler()
) 传递给应用程序app_register_callback()
。
使用调试器,我可以看到dynlib_do_setup()
函数指针内的值为0xfffffd7ffea13fa0
. 参数的函数体内app_register_callback()
突然有一个值0xfffffffffffeac58
因此,垃圾值0xfffffffffffeac58
存储在应用程序的回调表中,正如您在上面的堆栈跟踪中看到的那样,当调用该回调地址时应用程序崩溃也就不足为奇了。
同样,纯粹出于教育兴趣,这种神奇的腐败如何/为什么会发生?恢复我的构建系统更改如何/为什么突然解决了这个问题?
谢谢