c - "Source file is more recent than executable"除了它不是

标签 c linux makefile gdb ccache

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 cleanccache -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)
  • 缓存版本 3.1.9
  • SolydXK - SMP Debian 3.13.5-1 (2014-03-04)

最佳答案

也许您没有使用代码的最新编译版本,如果它在共享库中。您可以使用 ldd noLowerAddressGenerator 来查看程序的库依赖性;我不知道是否可以从 GDB 中找到相关的库,但应该有办法(如果你知道如何,请发表评论或编辑)。

如果确实如此,您可能需要在运行程序之前在 GDB 中设置环境 LD_LIBRARY_PATH,以将新建的库放在任何已安装的库之前。您可以考虑在链接时设置 RPATH ELF 变量,但这可能帮助不大。

另一种可能性是在您知道未安装库的系统上运行调试器。我使用 schroot 将构建/调试/安装环境分开,取得了很好的效果。

关于c - "Source file is more recent than executable"除了它不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391765/

相关文章:

c - 编译 .i 或 .ii 文件时忽略 gcc 标志 -include

c - 使用 stat() 和 ls -s 分配的 block 数不同

Linux:上传未完成的文件-进行文件大小检查(scp/rsync)

c - 在 makefile 中实现子目录

c++ - 在 make 文件中链接 SDL_image

c - C 中的压栈、出栈操作

c - IPC FIFO 生产者-消费者死锁

linux - 为什么关机报错?

linux - Gnu 排序 : stray characters in field specification

c++ - g++ 静态库的顺序很重要吗?