记录一个glibc 导致的段错误以及gdb 移植-程序员宅基地

技术标签: 开发工具  操作系统  嵌入式  

  • 上一篇我有相关关于一个段错误的记录,现在记录当时的段错误具体是在哪里的。
    // 从 GNU 的官网下载当前在使用的 glibc 的源代码以及最新的 glibc 源代码
    //  地址如下: http://ftp.gnu.org/gnu/libc/
    //  下载的是 glibc-2.12.2.tar  以及最新的 glibc-2.25.tar 两个版本
    //   这里要记住, glibc 2.12.2 这个版本是有一个bug 的,  times 的参数不能传 NULL。
    //  解压  glibc-2.12.2.tar  
    tar  -xvf  glibc-2.12.2.tar.gz
    cd   glibc-2.12.2
    vim sysdeps/unix/sysv/linux/times.c
    // 这个文件中的一段代码会导致程序调用了 times 运行一段时间后会产生段错误
    clock_t                                                                         
    __times (struct tms *buf)                                                       
    {                                                                               
      INTERNAL_SYSCALL_DECL (err);                                                  
     clock_t ret = INTERNAL_SYSCALL (times, err, 1, buf);                          
      if (INTERNAL_SYSCALL_ERROR_P (ret, err)                                       
          && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0))     
        {                                //   这里如果传的 buf == NULL 的话,也会执行里面的操作。                                           
          /* This might be an error or not.  For architectures which have           
         no separate return value and error indicators we cannot                    
         distinguish a return value of -1 from an error.  Do it the                 
         hard way.  We crash applications which pass in an invalid BUF                 
         pointer.  */                                                               
    #define touch(v) \                                                              
          do {                                    \                                 
        clock_t temp = v;                             \                             
        asm volatile ("" : "+r" (temp));                      \                     
        v = temp;                                 \                                 
          } while (0)                                                               
          touch (buf->tms_utime);
           // 如果是 NULL->tms_utime 可能在运行一段时候后产生段错误 
          touch (buf->tms_stime);                                                   
          touch (buf->tms_cutime);                                                  
          touch (buf->tms_cstime);                                                  
                                                                                
          /* If we come here the memory is valid and the kernel did not             
         return an EFAULT error.  Return the value given by the kernel.  */         
        }                                                                           
                                                                                
      /* Return value (clock_t) -1 signals an error, but if there wasn't any,       
         return the following value.  */                                            
      if (ret == (clock_t) -1)                                                      
        return (clock_t) 0;                                                         
                                                                                
     return ret;                                                                   
    }                                                                                                                       
    //  对比了最新版的 glibc , 他已经修改了对应的代码
     28   if (INTERNAL_SYSCALL_ERROR_P (ret, err)                                       
     29       && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0)      
     30       && buf)      
    //  这里对 buf 进行了判断, 如果为 buff 为真才进去。
  • 目前我的解决方式是用 以前交叉编译器里面的的glibc.so.6 , 暂时运行还未出现问题。
  • 但是使用了之前的 glibc 之后,发现 gdb 不能使用,所以又将 gdb 用以前的交叉编译器编译了一次。
  • 过程如下:
    //  第一步是下载 gdb 的源码以及 ncurses 的源码 以及 termcap 的源码
    gdb 下载地址  :  http://ftp.gnu.org/gnu/gdb/
    gdb  我是下载了一个比较保守的版本  7.2 ,我怕比较新的有问题。
    
    ncurses 下载地址:  http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.8.tar.gz
    termcap 下载地址:  http://ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
  • 解压相关源代码
    tar -xvf termcap-1.3.1.tar.gz
    tar -xvf gdb-7.2a.tar.bz2
  • 交叉编译 termcap
    cd termcap-1.3.1/
    mkdir output
    vim my.sh
    #!/bin/sh                                                                       
                                                                                
    ./configure --target=arm-none-linux-gnueabi --prefix=/home/sbc_7816_sdk6/test/gdb/termcap-1.3.1/output
    chmod +x my.sh
    ./my.sh
    make
    make install
    将 output/lib  下面的库copy 到交叉编译器的  lib 里面, include  也是
    cp output/lib/libtermcap.a  /home/sbc_7816_sdk6/aplex/linux-devkit/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib
    cp output/include/termcap.h   /home/sbc_7816_sdk6/aplex/linux-devkit/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include/  
  • 交叉编译 gdb
    cd ~/test/gdb/gdb-7.2/
    mkdir output
    vim my.sh
    #!/bin/sh                                                                       
                                                                                
    ./configure --target=arm-linux --host=arm-linux --prefix=/home/sbc_7816_sdk6/test/gdb/gdb-7.2/output
    chmod +x my.sh
    ./my.sh
    make
    make install 
     将生成的 output/bin  里面的 gdb  gdbserver  拷贝到 目标文件系统的  /usr/bin 下面,要覆盖
    完成
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33843947/article/details/85912498

智能推荐

模型参数优化(三):模拟退火_optimize live editor task gatbx.-程序员宅基地

文章浏览阅读1.6k次。1. 基本概念 补充。。。2. 实现步骤3. 代码实现_optimize live editor task gatbx.

zookeeper创建子节点报NoChildrenForEphemeralsException问题_no_children_for_ephemerals: exception: no_children-程序员宅基地

文章浏览阅读7k次。用ZOOKEEPER客户端向zookeeper的某一个节点添加子节点时出现以下错误:org.apache.zookeeper.KeeperException$NoChildrenForEphemeralsException: KeeperErrorCode = NoChildrenForEphemerals for /xxxxx/xxxx/at org.apache.zookeeper.K_no_children_for_ephemerals: exception: no_children_for_ephemerals

项目经验分享——完美解决Access denied for user 'root'@'localhost' (using password: YES)-程序员宅基地

文章浏览阅读10w+次,点赞7次,收藏29次。本问题缠绕了我数个小时,看问题吧 。总结一句话:权限问题。那怎么授权?第一步:停服务命令行:/etc/init.d/mysql stop如果不行,就执行下一行:service mysqld stop报:Stopping mysqld: [ OK ]第二步:跳过密码验证执行命令行:# /usr/bin/mysqld_safe --skip-g_access denied for user

vue 的vc与vm_vue vm vc-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏18次。vc与vm_vue vm vc

什么是UUID?_移动硬盘里.database_uuid-程序员宅基地

文章浏览阅读1.2k次。UUID是Universally Unique Identifier 的缩写,它是在一定范围内唯一的极其生成的标示符有以下几个涵义:1:经由算法生成2:非人工3:特定范围重复几率小应用:使用UUID的好处在分布式软件系统中就能很好地体现出来,他保证每个节点所生成的标示不会重复并随着web服务等整合技术的发展,UUID的优势将会更加明显<我只是用来生成数据库中的主码>详细内容请打开一下链..._移动硬盘里.database_uuid

Java系列-集合框架理解_java框架理解思路-程序员宅基地

文章浏览阅读2.6k次,点赞7次,收藏9次。关于java集合框架的理解_java框架理解思路

随便推点

静态HTML网页模板源码——仿男装女装购物商城(40页功能齐全)_html静态商城源代码-程序员宅基地

文章浏览阅读117次。精彩专栏推荐 【作者主页——获取更多优质源码】 【web前端期末大作业——毕设项目精品实战案例(1000套)】1 网页简介:此作品为学生个人主页网页设计题材,HTML+CSS 布局制作,web前端期末大作业,大学生网页设计作业源码,这是一个不错的网页制作,画面精明,代码为简单学生水平, 非常适合初学者学习使用。2.网页编辑:网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Web_html静态商城源代码

GEE入门篇|图像分类(一):监督分类_gee分类-程序员宅基地

文章浏览阅读1.8k次,点赞31次,收藏28次。GEE入门篇|图像分类(一):监督分类_gee分类

iOS中的URL Scheme_苹果计算器url scheme-程序员宅基地

文章浏览阅读857次。iOS中的URL Scheme 在iOS的SDK中提供了一个非常有意思的功能,它能将iOS的Application同自定义的URL Schema绑定,同时可以通过URL Scheme在浏览器或者是其他应用中启动这个Application。本文主要介绍如何通过URL Scheme的方式启动应用和参数的传递。 对应的源码配置文件为:CFBundleURLTypes_苹果计算器url scheme

Android腾讯直播SDK接入问题解决方案-程序员宅基地

文章浏览阅读335次。下载好Demo解压。1.是按照aar的集成方式。1.1导入aar包到libs里面1.2 add的gradle添加defaultConfig{ndk{abiFilters 'armeabi-v7a', 'armeabi'}}dependencies添加:/腾讯直播compile(name: 'LiteAVSDK_Professional_5.3.6004', ext: 'aar')1.3项目的gra..._android 腾讯直播达到试用版限制liteavsdk_trtc dau reaches the trial edition l

nRF5 SDK for Mesh(一) 介绍和下载源码-程序员宅基地

文章浏览阅读670次。一:  官网介绍地址:http://www.nordicsemi.com/Products/Bluetooth-low-energy/nRF5-SDK-for-MeshNordic offers a complete solution for the Bluetooth mesh specification with the nRF5 SDK for Mesh and the nRF..._nrf mesh下载

rpm常用命令记录_rpm命令-程序员宅基地

文章浏览阅读1.7k次。linux - rpm _rpm命令