CMake 3.9,arm-gcc 5.4.1,Linux / OSX:
我通过在编译器标志中添加-fstack-protector-strong
来启用stack smashing protection。这指示gcc在硬编码库libssp.a
和libssp_nonshared.a
中查找特殊命名的符号。
这些库作为构建的一部分存在于我的应用程序中,但是当CMake在配置阶段询问我的编译器时,它们尚不存在。
这会导致CMake失败,这很有意义:
[2/2] Linking CXX executable cmTC_0f43d
FAILED: cmTC_0f43d
/path/to/arm-none-eabi-g++ -fstack-protector-strong
CMakeFiles/cmTC_0f43d.dir/testCXXCompiler.cxx.obj -o cmTC_0f43d
/path/to/arm-none-eabi/bin/ld: cannot find -lssp_nonshared
/path/to/arm-none-eabi/bin/ld: cannot find -lssp
有什么方法可以
-fstack-protector-strong
吗?libssp
和libssp_nonshared
的空“虚拟”版本吗?或其他解决方法?
答案 0 :(得分:1)
告诉CMake在编译器询问期间不使用
-fstack-protector-strong
吗?
在CMake检查编译器时,只需在project()
调用后之后添加此编译器标志即可。
project(MyProject)
# ...
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong")
除了将标志附加到CMAKE_*_FLAGS
变量之外,还可以通过add_compile_options
命令将其添加:
project(MyProject)
# ...
add_compile_options("-fstack-protector-strong")
答案 1 :(得分:0)
就我而言,选择3十分简单。在我的工具链CMake文件中,我简单地添加了:
set(CMAKE_C_COMPILER_WORKS ON)
set(CMAKE_CXX_COMPILER_WORKS ON)
现在CMake不再浪费任何时间来查询我的编译器的功能。
这在我的特定情况下(嵌入式系统固件)有效,但是如何使CMake和-fstack-protector-strong
在非嵌入式程序上运行也很好。