“源文件比可执行文件更新”,但不是
Posted
技术标签:
【中文标题】“源文件比可执行文件更新”,但不是【英文标题】:"Source file is more recent than executable" except it isn't 【发布时间】:2014-04-30 15:10:23 【问题描述】:GDB 抱怨我的源文件比可执行文件更新,并且似乎调试信息确实与源文件的旧版本有关,因为 gdb 在空白行停止:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) up
#1 0x00007ffff7ba2d88 in CBKeyPairGenerate (keyPair=0x602010) at library/src/CBHDKeys.c:246
warning: Source file is more recent than executable.
246
(gdb) list
241 if (versionBytes == CB_HD_KEY_VERSION_TEST_PUBLIC
242 || versionBytes == CB_HD_KEY_VERSION_TEST_PRIVATE)
243 return CB_NETWORK_TEST;
244
245 return CB_NETWORK_UNKNOWN;
246
247
248
249 uint8_t * CBHDKeyGetPrivateKey(CBHDKey * key)
250
但可执行文件比源文件更新,请参见此处:
$ ls -l library/src/CBHDKeys.c
-rw-r--r-- 1 matt matt 9249 Apr 29 22:40 library/src/CBHDKeys.c
$ ls -l bin/noLowerAddressGenerator
-rwxr-xr-x 1 matt matt 17845 Apr 30 15:52 bin/noLowerAddressGenerator
我尝试在make clean
和ccache -C
之后重建,但出现了同样的问题。当我更新源文件时,我只添加了空格,所以程序逻辑保持不变。我觉得这与它有关,但由于我清除了 ccache 并使用make clean
清理了 build 和 bin 目录,我不确定这是怎么回事。
版本:
GNU Make 3.81 gcc (Debian 4.8.2-16) 4.8.2 GNU gdb (GDB) 7.6.2 (Debian 7.6.2-1) ccache 版本 3.1.9 SolydXK - SMP Debian 3.13.5-1 (2014-03-04)【问题讨论】:
CBKeyPairGenerate
是函数名,noLowerAddressGenerator
是可执行文件。
检查显而易见,但是:我假设在 gdb 可以拾取的路径上没有其他 noLowerAddressGenerator exe?
只有一个 noLowerAddressGenerator,当我传入文件的确切路径时,gdb 怎么会在任何地方混淆文件?
CBHDKeys.c 文件是一个源文件,它内置于 noLowerAddressGenerator 链接的库中。
是的,我之前(我忘记了)在 /usr/local/lib 中安装了库,它是从那里加载的,而不是我使用 -L
标志提供的路径。这个问题值得回答,还是应该删除?
【参考方案1】:
如果代码在共享库中,您可能没有使用最新编译版本的代码。您可以使用ldd noLowerAddressGenerator
查看程序的库依赖关系;我不知道是否可以从 GDB 中找到相关库,但应该有办法(如果您知道方法,请发表评论或编辑)。
如果确实如此,您可能希望在运行程序之前在 GDB 中 set environment LD_LIBRARY_PATH
,以便将新建的库放在任何已安装的库之前。您可以考虑在链接时设置 RPATH
ELF 变量,但这可能帮助不大。
另一种可能性是在您知道未安装该库的系统上运行您的调试器。我使用schroot
保持构建/调试/安装环境分离的效果很好。
【讨论】:
以上是关于“源文件比可执行文件更新”,但不是的主要内容,如果未能解决你的问题,请参考以下文章