记录一个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

智能推荐

MySQL数据库中删除数据有哪些方法_数据库怎么删除数据-程序员宅基地

文章浏览阅读1k次。在项目中遇到一个事情,我们同步所有监控主机的切片数据,大概1千台服务器的样子,每天的数据有十几万,刚开始数据查询还挺快,数据量越多查询效率就越慢。在同步数据的时候binlog也是比较大的,一段时间就把数据的存储耗尽了。于是就采取了,将这个数据放在另外的一个schema,并保留一段时间的数据。忽然间想到了truncate后自增主键id又从1开始了,小编又被自己的菜蠢哭了。这样数据就迁移完成,虽然耗时,但也是比较快的,几分钟内可是搞完,在可接受范围内,问题又来了。于是在网上查了查做个对比。_数据库怎么删除数据

【iOS】ViewController的生命周期_viewcontroller 进到下个页面和回到上个页面,生命周期-程序员宅基地

文章浏览阅读766次。ViewController是iOS中一种常见的类,也是MVC中的C控制器。_viewcontroller 进到下个页面和回到上个页面,生命周期

使用SigNoz搭建可观测系统_signoz 部署安装教程-程序员宅基地

文章浏览阅读340次。SigNoz是一个开源的应用程序性能监控工具,可以帮助你监控你的应用程序并排除故障,它可以进行链路追踪、基础设施监控以及日志管理,可以说是Datalog的开源版本。具体的能力如下:监控应用程序指标,如延迟、每秒请求、错误率等监测基础设施指标,如CPU利用率或内存使用情况追踪跨服务的用户请求对指标设置警报通过查找导致问题的确切痕迹,找到问题的根本原因查看单个请求追踪的详细火焰图。_signoz 部署安装教程

IFC/GLB格式在线转换_在线ifc转glb-程序员宅基地

文章浏览阅读96次。3D模型在线转换(https://3dconvert.nsdt.cloud/)是一个可以进行3D模型格式转换的在线工具,支持多种3D模型格式进行在线预览和互相转换。_在线ifc转glb

android 屏幕适配 详解——其实你并不需要这么麻烦_android unrecognized part '1080x1920' in configura-程序员宅基地

文章浏览阅读508次。bd“android屏幕适配”会发现全是类似于增加文件夹values-1080x1920文件夹并为每一个px(dp)都写进去的方式,个人是非常鄙视这种方式的(不喜欢的可以关闭了)。首先千篇一律:没有任何新鲜感。2.冗余较大:创建的文件太多,杂乱不堪看着都难受。3.适配性低:这个是最致命的,据统计仅仅是屏幕分辨率的个数就有上千种,你写的那十几个只不过是满足了部分(部分)而已,目前虚拟按键..._android unrecognized part '1080x1920' in configuration 1080x1920

SSM家政服务系统 计算机毕设源码04144-程序员宅基地

文章浏览阅读1.5k次,点赞47次,收藏44次。本论文系统地描绘了整个家政服务系统的设计与实现,主要实现的功能有以下几点:首页、公告管理(轮播图、公告通知)、用户管理(管理员、雇主用户、服务人员)、家政资讯、信息管理(家政资讯、资讯分类)、家政服务、订单中心、雇主评分、评价家政、评价雇主等功能,其具有简单的接口,方便的应用,强大的互动,完全基于互联网的特点....

随便推点

java字符类的英文表示_Java中判断字符串是中文或者英文的工具类分享-程序员宅基地

文章浏览阅读79次。直接上代码:import java.util.regex.Matcher;import java.util.regex.Pattern;/** * * * ClassName ShowChineseInUnicodeBlock * * * Description 提供判断字符串是中文或者是英文的一种思路 * * * @author wangxu wangx89@126..._jdk中表示英文符号的类

Linux根文件系统的制作-程序员宅基地

文章浏览阅读58次。1. 根文件系统文件系统是包括在一个磁盘(包括光盘、软盘、闪盘及其它存储设备)或分区的目录结构;一个可应用的磁盘设备可以包含一个或多个文件系统;如果您想进入一个文件系统,首先您要做的是挂载(mount)文件系统;为了挂载(mount)文件系统,您必须指定一个挂载点。 注:对于我们应用开发来说,购买开发板的时候,厂家会提供好现成的根文件系统和BootLoader等,如果需要,我们可以改变其中..._x86根文件系统制作mksquashfs

JS 浮点数计算-程序员宅基地

文章浏览阅读62次。一、从String中解析浮点数parseFloat(string)语法说明parseFloat是个全局函数,不属于任何对象.parseFloat将它的字符串参数解析成为浮点数并返回.如果在解析过程中遇到了正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数.同时参数字符串首位的空白符会..._js 负数和浮点数 怎么计算

在PyQt5的Qlistwidget的Item中设置图片_pyqt 5 listwidget 设置图标-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏6次。效果图如下: 方法一(手撸代码):实例化item时:item = QtWidgets.QListWidgetItem(QtGui.QIcon('C:\\Users\Administrator\Desktop\xxx.jpg'),'新建项目')在listWidget中设置item图片的大小:self.listWidget.setIconSize(QSize(25, ..._pyqt 5 listwidget 设置图标

DFT - 对芯片测试的理解(二) 详解_dft 运行逻辑-程序员宅基地

文章浏览阅读8.8k次,点赞9次,收藏109次。Tool自动插DFT point,会把DFF 变成 scan-FF ,但组合逻辑深处,Tool就做不到了,因此有 DPPM(测试良率)和coverage(覆盖率)来评价DFT的质量。当Tool进行DFT后,如果coverage不够的话,就要手动插入 测试点,即 UDTP(user defined test point),它们用于增加DFT的coverage,在组合逻辑深度插入测试点。因此,采用“改造”原本芯片中就存在的DFF,增加MUX选择的方式,来增加测试点,实现观测芯片内部关键点的功能。_dft 运行逻辑

异步窗体实现操作进度(ProgressWindow)-程序员宅基地

文章浏览阅读78次。前面写了几篇关于线程、BackGroundWorker等一下文章,现在主要对这些文章进行一个总结,写一篇关键异步窗体的,来实现操作的进度。 对于大型作业来说,循环处理是一件极其耗时的事情,如果都在Application的主线程中去执行,用户的界面感觉就如同死机一般,但是如果添加了进度窗体(ProcessWindow)来说,就不同了,程序会显示出一个新的窗体,而且给用户的效果是非..._window progressform

推荐文章

热门文章

相关标签