在Linux Mint上使用gcc 4.9.2为GNU / Linux 2.6.32构建的ELF 64位LSB可执行文件上运行strings
,我看到了
some/path/sourcefile1.cpp
some/path/sourcefile2.cpp
我不希望生成的可执行文件中包含源路径和文件名。我尝试使用strip --strip-all binaryName
删除它们,但路径和文件名仍然存在。
这是用CMake构建的。我给CMake一个-s
标志传递给编译器,但它似乎对结果没有影响。我不相信二进制文件是用调试符号构建的。我告诉CMake发布版本。
无论它是如何构建的,我都希望strip
能够删除源代码的路径和文件名。
如何从生成的二进制文件中删除此信息?我不关心可执行文件的大小。
更新
以下是我在strings
看到的内容:
/home/kmort/longPathHere/filename1.cpp -auxbase-strip CMakeFiles/filename2.dir/__/__/__/__/__/longPathHere/filename1.cpp.o
/home/kmort/longPathHere/filename2.cpp -auxbase-strip CMakeFiles/filename2.dir/__/__/__/__/__/longPathHere/filename2.cpp.o
etc
__FILE__
个引用。我删除了那些。 objdump --syms
会导致"没有符号"。-DNDEBUG
。所有-g
条目都已删除,因此我没有编译进行调试。readelf
只显示我不想要的一件事,它是Library rpath
,我认为我可以删除没问题。 .o
,这让我觉得它来自链接器。 -auxbase-strip
让我觉得-fno-compare-debug
应该有所帮助,但事实并非如此。cmake .. --DCMAKE_BUILD_TYPE=Release
,这应该会给我一个干净的发布版本。这令我感到困惑。
答案 0 :(得分:3)
您的源代码几乎肯定会调用__FILE__
宏
诊断/调试目的。这些调用扩展为源文件路径
无法剥离,因为它们是静态程序数据。
您说您正在制作发布版本。你应该可以
为您的发布版本定义预处理器宏,以消除所有
从编译中调试代码。要么你没有这样做,要么
源代码中的条件编译指令有问题而且无法执行
即使在发布版本中也消除了__FILE__
的一些调用。
最有可能的情况是您调用了assert()
宏
在您的源代码中,在您的发布版本中未被取消
因为您无法定义预处理器宏NDEBUG
。
除非assert()
无效,否则会调用__FILE__
- 和assert()
如果您未定义NDEBUG
,则不会取消。
如果您的发布可执行文件中确实存在所有不可剥离的路径
由于非无效assert()
s,你可以摆脱它们
将-DNDEBUG
添加到发布版本的预处理程序标志中。