我在/somepath
有自定义的SQLite3版本,因此/somepath/.libs
包含libsqlite3.so.0.8.6
及其符号链接。我想把一个程序与它联系起来并假设
g++ -O3 -g -fPIC -I /somepath -I /somepath/src -L /somepath/.libs -lsqlite3 -o myfile.so myfile.cpp
会奏效。它编译,但由于我的代码中的一些问题,我得到分段错误,并且在尝试调试时遇到类似LD_PRELOAD not working with my program和Setting my lib for LD_PRELOAD makes some processes produce loader errors的问题:我可以运行LD_PRELOAD=myfile.so /somepath/sqlite3 ...
,但在GDB下我得到符号查找错误,而LD_DEBUG=all LD_PRELOAD=myfile.so gdc -c core /somepath/sqlite3 ...
显示符号在/usr/lib/x86_64-linux-gnu/libsqlite3.so.0
而不是/somepath/libsqlite3.so.0
中被查找,并且毫不奇怪地缺少自定义构建中添加的函数的符号。我该如何解决这个问题并调试我的代码?
答案 0 :(得分:6)
-lsqlite3
参数应该是最后一个。 g++
的参数顺序很重要。您应该阅读有关runpath的更多信息,并且可能会传递-Wl,-rpath,/somepath/.libs
您可能希望将-v
一次传递给g++
以了解正在发生的事情(实际运行的程序)。您也可以通过-Wl,--verbose
来询问更详细的链接。
然后,您可以在可执行文件(以及ldd
)上使用readelf
来查找更多链接时间依赖项。
使用g++
的合适参数,您不需要其他选项gdb
答案 1 :(得分:2)