mips-openwrt交叉编译 undefined reference to `__stack_chk_guard 错误

2023-11-09

最近在mips-openwrt的工具链中交叉编译可执行程序时,出现了以下的错误:

    undefined reference to `__stack_chk_guard'

    undefined reference to `__stack_chk_fail'

    百度一下,得知这个错误的引起是因为启用了Stack Guard堆栈保护,什么是堆栈保护呢?如下:

    Stack Guard 是第一个使用 Canaries 探测的堆栈保护实现,它于 1997 年作为 GCC 的一个扩展发布。最初版本的 Stack Guard 使用 0x00000000 作为 canary word。尽管很多人建议把 Stack Guard 纳入 GCC,作为 GCC 的一部分来提供堆栈保护。但实际上,GCC 3.x 没有实现任何的堆栈保护。直到 GCC 4.1 堆栈保护才被加入,并且 GCC4.1 所采用的堆栈保护实现并非 Stack Guard,而是 Stack-smashing Protection(SSP,又称 ProPolice)。

     SSP 在 Stack Guard 的基础上进行了改进和提高。它是由 IBM 的工程师 Hiroaki Rtoh 开发并维护的。与 Stack Guard 相比,SSP 保护函数返回地址的同时还保护了栈中的 EBP 等信息。此外,SSP 还有意将局部变量中的数组放在函数栈的高地址,而将其他变量放在低地址。这样就使得通过溢出一个数组来修改其他变量(比如一个函数指针)变得更为困难。

-fstack-protector:

启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。

-fstack-protector-all:

启用堆栈保护,为所有函数插入保护代码。

-fno-stack-protector:

禁用堆栈保护。


那么我们可以知道堆栈保护是通过宏定义-fstack-protector来启用的,当然在makefile里面我是有用到这个宏定义的。

如果去掉这个宏定义或者加上-fno-stack-protector这个宏,yes,清静了,没有错误了。

     但到这里还不能结束,我们要探究一下为什么在mipsel-openwrt-linux-gcc里面是无法使用Stack Guard堆栈保护。

     我们知道Stack Guard是需要GCC 支持libssp的,我们就去openwrt源码看一下是否存在libssp这个库

     发现在build_dir/toolchain-mipsel_24kec+dsp_gcc-4.6-linaro_uClibc-0.9.33.2/gcc-linaro-4.6-2013.05/libssp目录下是存在libssp,但是我们在make menuconfig里却找不到可配置libssp的选项。

     现在只能google一把


是的,由于ssp库不能很好支持全平台,并没有把ssp默认编译。

问题已经解决,不想去折腾openssh了,如果不用Stack Guard进行堆栈保护,只能自己代码保护了,也不用这个高级玩意了。

楼主只能默默去掉了-fstack-protector-all


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

mips-openwrt交叉编译 undefined reference to `__stack_chk_guard 错误 的相关文章

  • 单个主机上的多个 glibc 库

    我的 Linux SLES 8 服务器当前有 glibc 2 2 5 235 但我有一个程序无法在此版本上运行并且需要 glibc 2 3 3 是否可以在同一主机上安装多个 glibc 这是我在旧 glibc 上运行程序时遇到的错误 mya
  • MIPS:将 BEQ 计算为十六进制机器代码

    我有一个作业 必须将 MIPS 指令转换为其十六进制机器代码 我知道如何转换 add addi lw 等指令 但是当它转换为 beq 之类的指令时 我感到困惑 我如何将这个 beq 转换为十六进制 0x00400108 beq t3 t5
  • 需要 GLbc 优化

    为什么无法重新编译 GLibc 并关闭所有优化 即 O0 特别是在这样做时 make CFLAGS O0 w CXXFLAGS O0 w I get error glibc cannot be compiled without optimi
  • MIPS 汇编:从整数转换为十六进制

    我发现这个代码片段我认为可以将整数转换为十六进制 然而 我根本不遵循它 我添加了一些评论 说明了我认为正在发生的事情 但我不知道为什么要这样做 那么 假设我正确地注意到每行正在做什么 有人可以向我解释为什么要这样做吗 至于它如何以任何方式帮
  • Glibc - ucontext.h 中出现错误,但仅适用于 -std=c11

    我有这个最小的 helloworld 扩展包括ucontext h include
  • 为什么标准输出不能被替换?

    出于教育目的 我尝试替换标准流 stdout stdin 和 stderr 我首先查找流的数据类型 我追溯到具有以下成员的 struct IO FILE gdb ptype IO FILE type struct IO FILE int f
  • 是否可以将 MIPS 寄存器名称与 GAS(GNU 汇编器)一起使用?

    如果我使用寄存器名称 我会得到 Error illegal operands add t0 zero zero 如果我使用寄存器号 8代替 t0 and 0代替 zero 有用 我使用的是 binutils 2 17 GNU 汇编器不直接支
  • Fallocate 和 ftruncate 之间有什么区别

    根据我的测试 他们都可以改变文件大小 为什么他们都可以将文件变大或变短 Fallocate 和 ftruncate 和有什么区别 ftruncate是一个简单的 单一用途的函数 根据 POSIX 文档 http pubs opengroup
  • 系统调用和陷阱之间的区别

    我想知道 MIPS 系统调用和陷阱指令之间是否有任何区别 我找不到任何涉及此的内容 所以我不确定是否有区别 陷阱似乎只是一个条件系统调用 但一些澄清可能会有所帮助 The SYSCALL and TRAP指令都会触发异常 但产生的异常是不同
  • 使用 UCLIBC 交叉编译 PHP

    这是一个转发 之前的帖子已关闭 移至 SERVERFAULT 并再次关闭 我认为这篇文章是一个有效的堆栈溢出问题 因为我认为它是由一些 automake 编译 链接错误引起的 这是一个编程问题而不是服务器管理问题 我会检查 uClibc 的
  • func 在 R-Format 指令集中意味着什么?

    I am very new to Assembly language I was reading about MIPS architecture and I am stuck with the last field of the Regis
  • 使用 glibc 而不是默认库编译的 C 程序:执行时权限被拒绝

    这是我在 stackoverflow 上的第一个问题 所以我会尽力做好 Context 我想提供一个可以在每个 Linux 发行版上运行的程序 例如 一个将使用 C 11 的程序 在没有 C 11 库的系统上运行 为此 我想复制我的程序使用
  • MIPS 中的影子寄存器是什么以及它们如何使用?

    当我了解 MIPS 架构时 我遇到了影子寄存器 据说它们是通用寄存器的副本 我无法理解以下内容 何时使用影子寄存器 MIPS 影子寄存器用于减少处理中断时的寄存器加载 存储开销 分配了影子寄存器组的中断不需要保存任何现有上下文来提供空闲寄存
  • 如何在 Debian 上升级 glibc?

    我听说我可以使用apt get install libc6 但我需要向 etc apt sources list 添加一些内容才能接收最新的 glibc 版本 我应该怎么办 我能够安装libc6 2 17 in Debian Wheezy通
  • 为什么分叉我的进程会导致文件被无限读取

    我已经将整个程序简化为一个简短的主程序来复制该问题 所以请原谅我它没有任何意义 input txt 是一个文本文件 其中包含几行文本 这个简化的程序应该打印这些行 但是 如果调用 fork 程序就会进入无限循环 一遍又一遍地打印文件的内容
  • C 到 MIPS - 函数和数组

    我正在尝试将以下 C 代码转换为 MIPS 程序集 数组的基地址存储在 a0中 变量索引存储在 a1中 变量 x 存储在 t0 中 void ld array char array int index x array index 当索引是一
  • 在MIPS中,有符号加法、无符号加法、有符号减法和无符号减法之间有什么区别?

    add rd rs rt addu rd rs rt sub rd rs rt subu rd rs rt 在MIPS中 有符号加法 无符号加法 有符号减法和无符号减法之间有什么区别 如果它们的结果相同 那么分类为使用有符号和无符号方法有什
  • 为什么MIPS中内存地址加4?

    如果某些内容存储在 0x1001 0000 处 则下一个内容将存储在 0x1001 0004 处 如果我是正确的 32 位架构中的内存块每个都是 32 位 那么0x1001 0002会指向32位的后半部分吗 首先 MIPS 架构中的内存地址
  • 使用动态链接器包装 glibc 函数

    我正在尝试包装 GLIBCfstat通过将我的库注入可执行文件来实现函数 可以是任何其他 这只是概念证明 我通过将我的库放置在可执行文件的位置来做到这一点RPATH用名字指着libc so 6 我的库的源代码如下 define GNU SO
  • 计算数字的二进制表示形式中 1 的数量的最佳方法。 (MIPS)

    我需要计算二进制数中 1 的数量 比如说 5 所以 00001001 将是 2 或 n 2 我正在使用 MIPS 最好的方法来做到这一点 最好的方法是count them 您可以检查是否设置了最低有效位 a1 by and用一个来代替它 如

随机推荐

  • QFileDialog 对话框类

    QFileDialog 对话框类 QFileDialog 对话框类是 QDialog 类的子类 通过这个类可以选择要打开 保存的文件或者目录 关于这个类我们只需要掌握一些静态方法的使用就可以了 通用参数 parent 当前对话框窗口的父对象
  • Navicat导出整个数据库

    Navicat使用 转存为SQL文件的方式导出数据库 如果有外键会导致在导入时出错 需使用数据传输的方式进行导出 选成使用文件方式进行保存 高级选项需选成 这样导出的SQL脚本就是完整版本的 在新数据库中导入不般不会报错 如果出现导入报错
  • MySQL国内镜像

    一 基础概念 MySQL是一种关系型数据库管理系统 使用标准SQL查询语句进行数据访问 广泛应用于Web系统的数据存储 MySQL国内镜像指的是在国内建立的MySQL镜像站点 用于提供MySQL的各种资源下载和服务 由于MySQL在国内访问
  • A *p=new B;

    好久没有摸c 了 刚刚看到个面试题 发现都要忘了 巩固下 A P new B A是父类 B是子类 虽然P是一个基类的指针 但是new B调用的是派生类B的构造方法 所以构造的是B类对象 先调用A的构造函数 再调用B的构造函数 构造完后会返回
  • 【计算机操作系统】第一章、操作系统引论

    参考书籍为汤老师经典教材 本博客旨在作为自己学习笔记并与大家分享 1 操作系统的目标和作用 1 1 目标 方便 有效 可扩充 开放性 1 2 作用 作为用户和计算机硬件系统之间的接口 用户可以通过1 命令方式2 系统调用方式3 图形 窗口方
  • 生产环境数据库版本太低导致:PostgreSQL - ERROR: could not determine data type of parameter $1

    1 分析 这个问题一般值前端传回来的参数和实体类或者数据库不匹配 2 报错的sql LIKE CONCAT query areaName 3 报错问题 PostgreSQL ERROR could not determine data ty
  • C++不定参数个数函数的写法

    C 不定参数个数的函数比较常见 比如printf 先写一个字符串 在字符串里有0个或多个 每个 要对应后面一个数据或者字符之类的东西 理论上有多少个 都是没问题的 难不成还要搞几亿个printf的重载吗 nonono 这个时候就要用到C 一
  • html实训报告致谢,学术论文致谢词范文

    学术论文致谢篇一 行文至此 不仅意味着我研究生学习阶段的结束 而且也意味着我接受正式教育的结束 此刻我心中百感交集 焦虑 喜悦 失落 激动 时间如白驹过隙 往往在你来不及回味之时 就已经匆匆流逝 开学的那个瞬间仍然历历在目 它仿佛就在昨天
  • 场景间切换与数据传递(以及物体删除技巧)

    先介绍一些基本函数 具体用法自己查文档 1 场景切换 Application LoadLevel Level1 2 读取场景时不移除物体 DontDestroyOnLoad object 会保留该物体的任何数据 包括坐标 可以用于任何物体
  • vue中使用three,绘制3d场景--给模型增加文字标签

    上一篇文章链接 点这里 完整代码点这里 实际需求中 模型总会有一个文字标签 解释模型相关的信息 这里要用到的是 精灵平面 Sprite 精灵平面 Sprite 是一个在3D场景中总是面对着相机的平面 也就是无论你怎么旋转 你会发现他都朝向你
  • Python + Jenkins + Selenium-Grid实现分布式web-ui自动化测试(centos+win10为例)

    简介 Selenium分布式运行 SeleniumGrid 环境配置 jenkins win10 ip 100 100 100 101 selenium hub win10 ip 100 100 100 101 selenium node1
  • R语言—数组

    文章目录 数组 数组的生成 array 使用dim函数生成数组 多维数组的子集操作 数组 向量是1维数组 矩阵是二维数组 数组的维数可以大于2 数组的生成 array 格式 数组名 lt array 数组元素 dim c 第一下标个数 第二
  • 桂林电子科技大学校园网自动登录

    桂电的校园网自动登录十分十分十分简单 1 原理 懒得说原理 2 步骤 网上有 3 结论和方法 1 结论 直接访问特定的url就能登录了 这里给出校园网登录的和联通的url 校园网url http 10 0 1 5 drcom login c
  • 【源码+文档】数据库设计医药销售管理系统之Java

    开发环境和开发工具 操作系统 win8 1 开发环境 Mysql Web 开发工具 Workbench Eclipse JDBC 功能需求分析 员工有权查看 添加会员 查看 添加供应商 查询药品 输入药品编号或名称 类别等查询该药品或该类药
  • 【Spring Boot 源码学习】深入 FilteringSpringBootCondition

    Spring Boot 源码学习系列 深入 FilteringSpringBootCondition 引言 往期内容 主要内容 1 match 方法 2 ClassNameFilter 枚举类 3 filter 方法 总结 引言 前两篇博文
  • UCENTER简单使用 GVINS配置C-RTK9P

    首先去 https www u blox com en product u center 下载ucenter 把C RTK9P通过USB连接到电脑 在Tool gt Receiver Configuration 里面 选好你要更改到RTK里
  • Qt之QGraphicsView实战篇

    前言 前面的章节介绍了 Graphics View 绘图架构 终于到实战了 真的是千呼万唤始出来 这一章节就用 Graphics View 绘图架构来做一个绘图工具 实现一些基础图形的绘制 废话不多说先来看一下结果演示 本文福利 莬费领取Q
  • c语言指针用法及实际应用详解,通俗易懂超详细!

    大家好 我是无际 今天给大家来讲解一下指针 我会由浅到深 最后结合实际应用讲解 让大家学会指针的同时 知道大佬们都用指针来干嘛 长文预警 全文大约5200多字 学指针看这篇文章就够了 很多人跟我刚学习c语言一样 都害怕指针 我也是后面做了一
  • 【2021最新版】Java多线程&并发面试题总结(108道题含答案解析)

    文章目录 JAVA并发知识库 1 Java中实现多线程有几种方法 2 继承Thread类 3 实现Runnable接口 4 ExecutorService Callable Future有返回值线程 5 基于线程池的方式 6 4 种线程池
  • mips-openwrt交叉编译 undefined reference to `__stack_chk_guard 错误

    最近在mips openwrt的工具链中交叉编译可执行程序时 出现了以下的错误 undefined reference to stack chk guard undefined reference to stack chk fail 百度一