首页 > 其他分享 >GCC安全编译选项

GCC安全编译选项

时间:2024-09-16 09:45:43浏览次数:8  
标签:选项 GCC set CMAKE CXX LINKER 编译 FLAGS SHARED

以CMake为例,给出安全编译选项的定义。

  • 关闭RPATH特性。

    set(CMAKE_SKIP_RPATH TRUE)
    
  • 开启栈保护。

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong")
    

    或者

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-all")
    
  • 开启GOT表保护。

    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro,-z,now")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,relro,-z,now")
    
  • 开启栈不可执行。

    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -Wl,-z,noexecstack")
    
  • 开启地址无关。

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
    

    或者

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
    
  • 随机化。

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpie")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pie")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -pie")
    

    或者

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pie")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -pie")
    
  • 隐藏暴露的符号。

    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility=hidden")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility=hidden")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fvisibility-inlines-hidden")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -fvisibility-inlines-hidden")
    
  • 删除调试符号。

    对于Linux环境下部署应用,建议不使用本选项,否则会对测试、生产环境的问题定位产生影响。

    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -s")
    set(CMAKE_EXECUTABLE_LINKER_FLAGS "${CMAKE_EXECUTABLE_LINKER_FLAGS} -s")
    
  • 开启整数溢出检查。

    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -ftrapv")
    
  • 开启栈检查。

    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -fstack-check")
    
  • 其它

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORTIFY_SOURCE=2 -O2")
    

注意

上述选项对于Clang一样可用。
推荐使用最新版本的GCC或者Clang,或者在CMakeLists.txt中增加检查编译器是否支持上述选项的代码。
此外,推荐阅读安卓NDK提供的android.toolchain.cmake文件,上述选项基本均有提及。

标签:选项,GCC,set,CMAKE,CXX,LINKER,编译,FLAGS,SHARED
From: https://www.cnblogs.com/jackieathome/p/18416021

相关文章

  • C++编译 链接 执行那些事
    OK!Rightnow!  Let's go!如何从源文件开始,实际的文本文档到可执行的二进制代码,写C++程序的基本流程。实际是你有一些C++的源文件,然后将这些源文件给到编译器,编译器将其转成二进制的东西,二进制的东西可能是某种库,或者是可执行的程序。在#符号之后的都是预处理语句......
  • 香橙派Zero3 全志H618设备树插件编译
    基本信息全志H618SDK:香橙派官方提供SDK虚拟机:Ubuntu22.04整体的SDK文件夹名称为:orangepi-build-nextSDK中Linux内核路径:orangepi-build-next/kernel/orange-pi-5.4-sun50iw9编译环境指定首先需要指定交叉编译器:在SDK中的toolchains文件夹中含有很多编译器:对于......
  • 在Ubuntu中编译含有JSON的文件出现报错
          在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费截取部分含有JSON部分的代码进行展示char*str=" { \"title\":\"JSONExample\", \"author\":{ \"name\":\"JohnDoe\&quo......
  • 条件编译 - 代码裁剪的工具 --进阶C语言
    目录条件编译-代码裁剪的工具为何要有条件编译条件编译都在那些地方用?见一见条件编译的代码宏是否被定义vs宏是否为真or假编译器也能够自动帮你加上宏GCCVS2023-VS2019#ifdef/#ifndef#if注意事项让#if和#ifdef/#ifndef完全一样条件编译也支持嵌套一个使用#ifdefined能起到很......
  • C++编译器的那些事
    接上文OK!Rightnow!  Let's go!C++编译器是如何工作的?C++编译器实际负责什么?我们把C++代码写成文本。就是这样,他只是一个文本文件,然后我们需要一些将文本转换为实际应用程序的方法,我们的计算机可以运行。从文本形式到实际可执行的二进制文件,我们基本上有两个主要......
  • (2)Proteus8.7添加STM32F103C6直接使用编译xxx.hex文件关键步骤
    1)新建工程中选项 2)Protues8.7支持芯片如下:3)点击STM32选择Keil编译生成的xxx.hex文件 4)使用virtualterminal显示串口信息。仿真状态,点击Debug菜单项,按图操作。 ......
  • LineageOS源码下载和编译(Xiaomi Mi 6X,wayne)
    版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/源码下载LineageOS官网:https://lineageos.org/LineageOS源码github地址:https://github.com/LineageOS/androidLineageOS源码国内镜像地址:https://mirrors.tuna.tsinghua.edu.cn/help/line......
  • Android Studio报错: Could not find pub.devrel:easypermissions:0.3.0, 改用linux编译
    在Androidstudio中去编译开源的仓库,大概率就是各种编译不过,一堆错误,一顿改错,基本上会耗费非常多时间,比如:这个就是改gradle版本,改成7.2,修改完成之后,还有其他报错: Executionfailedfortask':app:checkDebugDuplicateClasses'.>Couldnotresolveallfilesforconfiguration......
  • Linux内核开发环境-代码编译
    建议点击这里查看个人主页上的最新原文作者:陈孝松主页:chenxiaosong.com哔哩哔哩:陈孝松课程:chenxiaosong.com/courses博客:chenxiaosong.com/blog贡献:chenxiaosong.com/contributions邮箱:[email protected]交流群:544216206,点击查看群介绍点......
  • 交叉编译 MQTT 库
    一.编译openssl库1.原因因为MQTT客户端库依赖于openssl库,所以通常在移植MQTT客户端库的时候,需要先移植openssl、交叉编译openssl得到链接库文件以及头文件,然后再来编译MQTT客户端库。2.交叉编译openssl库流程2.1下载首先在官网上下载openssl源码,官网......