多种方式解决交叉编译中glibc版本不兼容导致的编译问题(libc.so.6: version `GLIBC_xxx‘ not found问题)

目录

背景

开始动手!

第一种

第二种

         第三种


背景

一个常见的问题就是:

拿到客户的开发板后需要验证自己本地搭建的交叉编译环境是否正确,这影响到后续的开发.

glibc就是指libc.so.6这个动态库,libc.so.6软链接到实际的动态库.

开始动手!

在开发板上,如果有例子比如说可执行程序.那么可以通过

 nm sample_adc | grep GLIBC_ : sample_adc(作为可执行程序) 查看那些调用是用到glibc 库的

通过

 strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_  查看glibc 的所有版本,如果是开发板注意库的路径.

查看开发板和本地linux所支持的最高版本,目前我的工作证明链接低版本的glibc的bin可以在高版本上运行,高版本编译的bin不能在低版本的glib的环境中运行。

网上看了很多种方式,总结下来有这么几种:

个人推荐用第三种,既不影响本地的glibc,又能完成目标.

第一种

参考

linux安装指定版本glibc,适配降级_redhat6.9降级glibc-CSDN博客

1.更新linux系统的glibc的版本,使得可以和开发板上适配.一般都是开发板上的glibc的版本过低.需要降低本地的glibc的版本.

这种方式我破天荒在第一次安装好低版本的glibc库后,通过在/etc/profile中 加入

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/glibc-2.25/lib

再执行 ‘source /etc/profile’  

使得再本地终端中生效,第一次编译刚好没有问题,make 命令竟然没有报错,而且编译出的bin在开发板上能运行 .因为那天是星期五快下班了没怎么关注make是如何链接到glibc的.就没有关注,直到星期一,发现make不了了,因为make是在/usr/bin 中  它链接的是export 之前的 glibc 库 , 而export 修改了 LD_LIBRARY_PATH 的值,导致找不到之前链接的动态库了.这一点怎么在之前却没有出现! ls 等其他命令都出现了问题,因为它们这些可执行命令都链接的是之前的glibc .除非用 sudo ls 才会生效.

后面未找到解决方法.本身这种方式也不灵活且会导致很多问题.

第二种

这种方式是在搜索途中找到的.通过指定动态库路径和库名的方式去编译. 但是对于非本人开发的SDK(以Makefile构建)的项目来看,肯定是不希望改动Makefile文件的.按照开发者的规则来进行能降低奇奇怪怪的错误.

参考 高版本gcc编译出的程序在低版本glibc机器上运行 - 简书 (jianshu.com)

这种方法如果是自己比较熟悉的工程通过指定路径的方式未尝不是一种比较好的选择.

第三种

通过patchelf的方式,这种方式是修改二进制的方式.把编译出来的二进制程序所链接的glibc动态库进行修改,这种方式形象的比喻就是  无论过程如何,但是编译的产物bin所链接的bin 通过 pathcelf 修改. 这种方式,我使用起来效果甚好,所以详细描述.

查看二进制程序依赖的glibc库及其库版本

 nm sample_adc | grep GLIBC_

 

通过

file xxx(bin二进制可执行程序)

查看链接的库.

发现链接的是系统的 /lib下的库.(这里看不出glibc,但patchelf修改后会有变化,通过这点来验证patchelf是否成功).

使用patchelf需要准备一下几件事:

  1. 确定开发板上的glibc的版本,比如开发板上最高是2.25,那么我们要确定自己本地要装2.25的glibc的库.
  2. 本地的linux系统下(我这里的ubuntu)下载glibc的库然后编译.这一点有些问题。参考linux安装指定版本glibc,适配降级_redhat6.9降级glibc-CSDN博客

         注意

../configure --prefix=/opt/glibc-2.17 --disable-werror

使得make & make install 能够通过

       还有一种方式. 通过glibc-all-in-one 这个工具来管理glibc,支持下载和编译具体的glibc库.这一种也是我推荐的.能用工具来管理当然就用工具来管理了.

做完以上的两件事,则能够得到编译后的glibc库了,接下来就是按照patchelf.

  1.  
    //新建目录git clone https://github.com/NixOS/patchelf.git
    //进行仓库
    ./bootstrap.sh
    (.bootstrap.sh执行报 autoreconf: not found
    执行sudo apt-get install autoconf automake libtool)
    ./configure
    make
    make check
    sudo make install
    

    安装完后.通过输入patchelf 查看是否安装成功.

  以编译后的可执行程序来指定与开发板适配的glibc:以2.25为例:

patchelf --set-interpreter  xxx(第一步编译的glibc的文件路经也就是libc.so.6) --set-rpath  xxx(第一步编译的glibc的搜索路径)  xxx(可执行程序)

比如:

patchelf --set-interpreter  /opt/glibc-2.25/lib/libc.so.6(glibc的文件路经) --set-rpath   /opt/glibc-2.25/lib(glibc的搜索路径)  spi_master(可执行程序)

没有输出则成功:

通过

file xxxx

 查看

 此时此刻拷贝到开发板中运行,正确运行.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫罐头品牌排行榜盘点!猫罐头哪个牌子好?

很多猫主人会发现他们家的猫咪可能对猫粮感到腻了,或者猫咪平时不爱喝水,还有一些主人可能会注意到猫咪太瘦了,想尝试给它们添加一些猫罐头,但又不确定如何选择。目前市场上的猫罐头品牌众多,确实让人有些困惑。那么&a…

K8S(一)

一、kubernetes 概述 1、kubernetes 基本介绍 kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效…

LVGL 像文字一样,显示任意自定义符号

颜色可以在程序中设定,符号的C数组生成 这种应用非常适合类似汽车仪表盘中,有很多行业内特定符号需要显示的场景,而且符号需要根据情况改变颜色。网上这方面基本没有资料,本文是作者根据LVGL自定义字库的源代码修改来实现的。 使用工具: 设置:(根据液晶屏不同可能不同…

Git详解

Git是一个开源的分布式版本控制系统,常用于软件开发中对代码版本管理。Git具有版本控制、协作开发、分支管理、代码审查等功能,能够记录每次代码修改的内容和时间,并能够回滚到任意历史版本,方便团队协作和代码维护。 Git的基本概…

JS:给数字添加千分位符(每3位数用逗号隔开)

背景 如果一串数字的长度太长,就不方便阅读,因此可以采用分隔符对数字进行分割本文的分割规则是: 如果数字的长度大于等于5则进行分割,每3位数用逗号分割开 解决 数字可以分为:number类型的数字和字符串类型的数字&…

前端反卷计划-组件库-03-组件样式

Hi, 大家好!我是程序员库里。 今天开始分享如何从0搭建UI组件库。这也是前端反卷计划中的一项。 在接下来的日子,我会持续分享前端反卷计划中的每个知识点。 以下是前端反卷计划的内容: 目前这些内容持续更新到了我的 学习文档 中。感兴趣…

【每周一测】Java阶段三第三周学习

目录 1、事务四个隔离级别中,哪一个不能防止脏读 2、关于sleep()和wait(),以下描述错误的一项是() 3、以下关于Servlet生命周期说法错误的是( ) 4、下列概念解释说明错误的是 5、在 JWT 中&#xff0c…

ESP32 MicroPython 图像采集及拍照功能的使用⑧

ESP32 MicroPython 图像采集及拍照功能的使用⑧ 1、摄像头应用2、图像采集5、实验结果6、按键拍照7、实验内容8、参考代码9、实验结果 1、摄像头应用 小车配有摄像头,可以使用摄像头实现拍照、图像显示、图像识别等功能。小车已经内置有我们专门移植的摄像头驱动库…

[Docker]六.Docker自动部署nodejs以及golang项目

一.自动部署nodejs 1.创建node项目相关文件 app.js代码如下: var express require(express);var appexpress();app.get(/,function(req,res){res.send(首页update); }) app.get(/news,function(req,res){res.send(首页); })//docker做端口映射的时候不要指定ip app.listen(30…

大模型重塑软件设计,南京真我加入飞桨技术伙伴,大模型生态圈成员又添一员!

为帮助伙伴更快、更好的应用大模型技术,飞桨技术伙伴体系及权益基于星河共创计划全面升级,通过丰富的场景、技术、算力、品牌等资源,为伙伴企业提供一站式的大模型资源对接,全面降低创建AI原生应用的门槛。 近日,南京…

win10家庭版系统远通过一根网线程连接另一台机器

用网线连接两个机器 打开cmd命令行 输入ipconfig,查看 复制 IPv4地址 打开 远程桌面 程序 点击连接 输入在另外一机器设置好的用户名和密码即可

docker打包chatpdf(自写)

docker打包上传 docker build -t kitelff/chatpdf:v0.1 .##修改镜像名字 docker tag c2c1a0eb4e08 kitelff/chatpdf:v0.1## push docker push kitelff/chatpdf:v0.1上传文件,测试效果

BananaPi BPI-M6(Raspberry Pi 5) Android 平板电脑镜像测试温度

我已经在本文中介绍了 全新的Banana Pi BPI-M6,并讨论了其与Raspberry Pi 5的硬件特性比较。 然后我将 Android 平板电脑固件上传到 eMMC,从而使 Banana Pi 实际可用。一开始有点坎坷,但文章中有更多内容。 在另一台电脑上,一切都…

Arcgis小技巧【16】:ArcMap的那些功能在ArcGIS Pro里都去哪儿了?

有部分小伙伴现在已经用上了ArcGIS Pro,但可能还会有些不习惯。 一个很重要的原因,原来在ArcMap中的一些功能,好像在Pro里消失了。 不排除一些功能确实被移除了,但大部分其实是因为UI的变化,给放在了别的地方。 这里…

Linux CentOS7配置网络参数

CentOS6及以前版本中主要使用ifconfig工具,查看、配置网络参数。后来对推荐使用ip命令查看配置网络参数。而centos7中,不再赞成使用ifconfig工具,取而代之的是nmcli工具,服务管理也是以systemctl工具取代了service,这些之前版本的…

学霸教你自学人工智能

在这个信息爆炸的时代,人工智能已经渗透到我们生活的方方面面。无论是语音助手、自动驾驶汽车,还是医疗诊断,人工智能都在发挥着越来越重要的作用。如果你对人工智能充满热情,希望在这个领域有所建树,那么,…

微信私域运营工具CRM

为什么要做微信私域? 客户在哪里?微信!在中国,不论男女老少,90%的人每天使用微信至少5次,每次使用时间超过90分钟,已经成为像吃饭穿衣一样的生活必需品。因此,我们的目标客户就在微…

【github】初学者使用指南

作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者,目前于新西兰奥克兰大学攻读IT硕士学位。荣誉:阿里云博客专家认证、腾讯开发者社区优质创作者,在CTF省赛校赛多次取得好成绩。跨领域…

VMware——WindowServer2012R2环境mysql5.7.14解压版安装主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql(主)2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …

ESP32C3小飞控调试

ESP32C3小飞控调试 - 1 ESP32C3小飞控板赶在国庆节前发出打样,假期后上班就收到了样板,但是迟迟没有动手调试,这两天终于抽出时间调试了,调试过程还算顺利,基本没有遇到什么大问题,下面记录一下调试过程。…