1

我在静态链接我的 C 应用程序时遇到问题。所有库都存在(.a),就在一个月前,我能够静态链接我的应用程序而没有错误。但是,一旦我在 Eclipse 中激活静态链接选项,我就可以编译而不会出现错误,但是当我尝试运行它时,我会收到一个“分段错误”并且它会停止。

我尝试调试,这就是 eclipse 向我展示的内容:

No source available for "_start() at 0x4017f7"
No source available for "__libc_start_main() at 0x522389"
No source available for "__libc_csu_init() at 0x5228f7"
No source available for "frame_dummy() at 0x4018bd" 
No source available for "__register_frame_info_bases() at 0x52194b" 
No source available for "0x0" 

我使用以下库:-lgcrypt -lgpg-error -lmxml -lpthread -lrt。任何想法可能是什么问题?我也可以发布 gdb 跟踪,但它很长。

链接器命令: 调用: 调用: GCC C 链接器 gcc -static -o "X - Client" ./src/lib/stopwatch-0.2/stopwatch.o ./src/lib/rscode-1.3/berlekamp.o ./src/ lib/rscode-1.3/crcgen.o ./src/lib/rscode-1.3/galois.o ./src/lib/rscode-1.3/rs.o ./src/lib/Salsa20/ecrypt.o ./src/ lib/helper-Client.o ./src/PoR-Client.o -lgcrypt -lgpg-error -lmxml -lpthread -lrt 完成构建目标:X - Client

4

1 回答 1

0

这可能不是链接的问题。您可能在读取未初始化的内存或读取和写入超出数组末尾时遇到问题。

在这种情况下发生的情况是,在一个构建中,您正在读取的内存恰好设置为非崩溃值(例如,您在数组末尾读取到具有零的区域),但随后在另一个构建中数据结构的顺序不同,现在您正在读取具有意外值的内容。

或者您可以在一个构建中将末尾写入一个您不再需要的数据结构,而在此构建中,数组末尾之后的内容至关重要。

还要检查您的程序在调试和优化版本上的运行方式是否不同。优化改变了数据结构的布局、填充和初始化。(例如,调试构建通常会将所有内存归零,并且堆栈帧用调试数据填充)。

我强烈建议你通过像 valgrind 这样的工具来运行你的程序。它会为您找到这些类型的问题。

于 2014-11-17T18:23:52.553 回答