如何调试包含在libtool脚本中的程序?

14

我有一个涉及以下内容的项目:

  • 共享库,例如:mylib.so
  • 使用这些共享库的(测试)程序,例如:test_mylib

当我尝试在test_mylib上运行gdb时,它会打印:

"test_mylib": not in executable format: File format not recognized

当我直接使用实际程序(.libs/test_mylib)时,它仍然抱怨:
.libs/test_mylib: can't load library 'libhello.so.0'

如何使用gdb来调试我的程序?
2个回答

18
这是我几天前遇到的问题,目前在SO上还没有通用的解答,只有特殊情况的答案。在这里,我找到了答案: http://www.gnu.org/software/libtool/manual/html_node/Debugging-executables.html 在程序被安装之前,系统不知道在哪里寻找共享对象。它们通常位于其源文件夹的.libs子目录中。
Libtool生成一个方便的脚本,允许在实际安装之前进行调试(谁想在安装有错误的软件之前就调试它呢?)。幸运的是,生成的脚本提供了一个辅助工具来解决这个问题。
libtool --mode=execute gdb test_mylib

1
在OS X机器上,我遇到了error: libtool: unknown option character \-' in: --mode=execute`的错误(我的解决方法是安装到前缀,但也许像下面提到的那样使用--disable-shared更简单)。 - unhammer

8
在开发过程中,libtool文档推荐的解决方案是使用静态链接,就像我在Build libtool application with static linking to local components中所描述的那样。要实现这一点,可以在./configure脚本中使用--disable-shared选项。例如:
./configure --enable-debug --disable-shared

现在生成的可执行文件是直接可执行的二进制文件,而不是一个libtool脚本。这样做的额外好处是将构建时间减少了约一半。

其他与 --disabled-shared 解决方案无关的背景信息:https://autotools.io/libtool/wrappers.html 和 https://www.gnu.org/software/libtool/manual/html_node/Debugging-executables.html - Brent Bradburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接