GCC安全编译选项

2023-10-31

转载自:http://www.jackieathome.net/archives/796.html

前言

今天在学习编译器堆栈保护技术时,突然发现gcc的安全编译选项我还从来没去了解过

发现一篇写的不错的帖子,进行转载保存

以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")

上述选项对于Clang一样可用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC安全编译选项 的相关文章

随机推荐

  • Linux新用户登录时出现“-bash-4.2$”的解决办法

    Linux服务器新建的用户在登录时显示 bash 4 2 而不是 user hostname 的显示方式 出现此问题的原因是在添加普通用户时 用户家目录下丢失了 bash profile和 bashrc两个环境变量文件 解决办法 cp et
  • 【pygame】Sprite类

    Sprite类 pygame sprite Sprite 可视游戏中的对象的基础类 属性 Sprite groups gt Sprite 使用Sprite类派生新类时需要分配 Sprite image 和 Sprite rect 属性并添加
  • web开发入门感想

    原创 negoo 方晓 来源 http phpinsider cn 经常在某些论坛和QQ群里看到一些朋友会问 怎样才能学好PHP 怎样才能学好 语言 但别人回答最多的是 从最 简单 的开始 s 2 这个简单也许真的不简单 呵呵 下面我想分享
  • promote 的充值及投放技巧not.10

    v
  • [PAT] Chemical Equation

    A chemical equation is the symbolic representation of a chemical reaction in the form of symbols and formulae wherein th
  • Java多线程基础知识之可重入锁和非可重入锁

    前言 可重入锁和不可重入锁的概念 1 可重入锁 所谓可重入锁 意味着线程可以进入它已经拥有的锁的同步代码块儿 2 非可重入锁 所谓非可重入锁 即若当前线程执行某个方法已经获取了该锁 那么在方法中尝试再次获取锁时 就会获取不到被阻塞 3 说明
  • 监督学习(五):LightGBM算法

    监督学习 五 LightGBM算法 提升树是利用加法模型和前向分布算法实现学习的优化过程 它有一些高效的实现 如GBDT XGBoost和pGBRT 其中GBDT是通过损失函数的负梯度拟合残差 XGBoost则是利用损失函数的二阶导展开式拟
  • Vue node.js实现支付宝支付(沙箱测试)

    一 支付宝开放平台创建应用 打开支付宝开放平台首页 注意 正式环境 沙箱环境都需要此步 1 选择开发者中心 gt 网页 移动应用 此时是实现网站支付功能 2 选择支付接入 3 填入名称 注意名称规范 不能写测试字样 详细参考官网命名规范 上
  • 批处理特殊符号 通配符与转义符

    常用特殊符号 1 命令行回显屏蔽符 2 批处理变量引导符 3 gt 重定向符 4 gt gt 重定向符 5 lt gt lt 重定向符 6 命令管道符 7 转义字符 8 组合命令 9 组合命令 10 组合命令 11 字符串界定符 12 逗号
  • form表单以ajax方法提交,附加额外的数据

    在项目中有个添加账户的模块 如下图 填写的信息以表单是形式ajax的方法提交 但是又需要添加额外信息给后台 比如 创建人 首先要引入JQuery js库 和jquery form js var options url weburl acco
  • 威三学社介绍

    公司介绍 北京威三电子科技有限公司 成立于 2017年 专注于提供创新性科研和教学解决方案 主要面向无线设计和测试 人工智能视觉与核物理化学分析等领域 公司愿景 通过强大灵活的技术解决方案帮助工程师和科学家提高生产力 讲师介绍 尤恺元先生
  • TextureView/SurfaceView/GLSurfaceView/VideoView渲染视频(点播播放器)

    OpenGL实现视频的剪裁 旋转 水印 滤镜 将 ffmpeg 库移植到 Android 平台 在播放网络上的视频流时 Android原生的MediaPlayer支持两种协议 HTTP和RTSP 这两种协议最大的不同是 RTSP协议支持实时
  • docker打包部署项目实践-Go项目为例

    如何使用Docker打包 部署Go项目 一 为什么使用Docker打包部署项目 与宿主机隔离 增加安全性 使用容器部署 便于服务编排 管理 对接云原生 便于服务迁移 轻量高效 操作简单 二 docker compose和Dockerfile
  • C语言实现猜数游戏

    猜数游戏 随机数 每次召唤rand 就会得到一个随机的整数 include
  • 数字货币:影响深远的创新

    央行正式推出数字人民币 这是我国金融领域一件具有战略意义的大事 也是我国货币史上从未有过的创新 引起业界的广泛关注 数字人民币就是放在手机钱包里的现金 与我们口袋钱包里的现金完全一样 比钱包里的现金还要安全 便利 不存在丢失 被盗情况 因为
  • React.memo

    前言 什么是react的memo 简单来说就是父组件改变时 子组件也会跟着重新渲染 子组件没有用父组件改变了的值 这时我们就要利用memo规避一些无用的页面渲染 我们可以通过三种方式规避一些无用的渲染 类组件的两种方式 shouldComp
  • 解决运行Hexo报错hexo : 无法加载文件hexo.ps1,因为在此系统上禁止运行脚本

    项目描述 使用如下命令安装 Hexo 后运行报错 npm install hexo cli g 问题描述 PS C Users 87897 Desktop xavierjiezou github io gt hexo s hexo 无法加载
  • TortoiseGit操作educoder仓库简介

    环境配置 Git下载安装 Git下载官网 https git scm com 进入后下载相应版本 直接安装即可 TortoiseGit下载安装 TortoiseGit官网为 https tortoisegit org 进入后点击downlo
  • android 代码 卸载app,Android在一个app中安装并卸载另一个app的示例代码

    Android在一个app中安装并卸载另一个app 1 在app src main下新建文件夹asserts 将准备安装的apk文件放在asserts内 2 在app src main res下新建文件夹xml 右击xml文件夹 选择new
  • GCC安全编译选项

    转载自 http www jackieathome net archives 796 html 前言 今天在学习编译器堆栈保护技术时 突然发现gcc的安全编译选项我还从来没去了解过 发现一篇写的不错的帖子 进行转载保存 以CMake为例 给