静态链接会创建Segmentation Fault错误

时间:2014-11-17 12:16:32

标签: c segmentation-fault static-linking libgcrypt

我在静态链接我的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 - 客户

1 个答案:

答案 0 :(得分:0)

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

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

或者你可以在一个版本中将结尾写入一个你不再需要的数据结构,而这个版本,超出数组末尾的东西是至关重要的。

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

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