hisiv400+glibc-2.23编译

使用hisi编译,glibc库    笔记记录。



./configure  时不使用--with-headers 选项的处理方式,

:这时候编译glibc时默认寻找,宿主机include/  路径及usr/asm/include/下asm等路径下头文件。

首先从gnu官网下载最新版的glibc,地址http://www.gnu.org/software/libc/ 

$tar xvf glibc-2.23.tar.bz

$cd glibc-2.23

$./configure --prefix=/user1/yueyc/hisi-glibc-2.23 --host=arm-linux --enable-add-on=nptl CC=arm-hisiv400-linux-gcc CXX=arm-hisiv400-linux-g++


报错:configure: error: you must configure in a separate build directory提示错误,需要在独立的build目录下,进行configure 。在一个新的路径下 从新.configure 即可


$./glibc-2.23/configure --prefix=/user1/yueyc/hisi-glibc-2.23 --host=arm-linux --enable-add-on=nptl CC=arm-hisiv400-linux-gcc CXX=arm-hisiv400-linux-g++


configure通过,make通过 ;makeinstall 通过;



./configure  时使用--with-headers 选项的处理方式,这个时候可以选择不同版本内核的头文件进行glibc的交叉编译


宿主机:cetos5.4  linux2.6.18





目标机:hisi3536 + linux3.10.y

.


制作库的文件路径架构

glibc-2.23的源码路径 : usr/xxx/glibc2.23/build/glibc-2.23 /SourceDir

glibc-2.23的配置路径:  usr/xxx/glibc2.23/ /ConfigDir

glibc-2.23的安装路径:  usr/xxx/glib2.23_install/ /InstallDir

linux3.10.y源码路径:    usr/xxx/kernel_3536/ /KernelDir


1.进入linux3.10.y 源码路径执行,头文件安装指令,将头文件安装到glibc的预安装目录下,等待make glibc时使用。

make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- INSTALL_HDR_PATH=/usr/xxx/glib2.23_install/ headers_install

make ARCH=arm CROSS_COMPILE=$gcc INSTALL_HDR_PATH=$InstallDir headers_install

usr/xxx/glib2.23_install/下会生成include文件夹及下属文件。


2、进入usr/xxx/glibc2.23/路径下,进行./configure 配置

./glibc-2.23/configure --prefix=/usr/xxx/glibc2.23_install --host=arm-linux --enable-add-ons --with-headers=/usr/xxx/glibc2.23_install/include CC=arm-hisiv400-linux-gcc CXX=arm-hisiv400-linux-g++


3.configure 通过,make通过,make install 通过。



刚开始的时候把--with-headers=usr/xxx/kernel_3536/inlclude ,将头文件依赖直接指到了kernel源码的include路径上,configure通过后make时会报错:

if test -r /mnt/LFS/build/glibc-2.12.1-BUILD/csu/abi-tag.h.new; then
mv -f /mnt/LFS/build/glibc-2.12.1-BUILD/csu/abi-tag.h.new
/mnt/LFS/build/glibc-2.12.1-BUILD/csu/abi-tag.h; \
else echo >&2 'This configuration not matched in ../abi-tags'; exit 1; fi
mv -f /mnt/LFS/build/glibc-2.12.1-BUILD/csu/version-info.hT
/mnt/LFS/build/glibc-2.12.1-BUILD/csu/version-info.h
make[2]: Leaving directory `/mnt/LFS/build/glibc-2.12.1/csu'
make[1]: *** [csu/subdir_lib] Error 2
make[1]: Leaving directory `/mnt/LFS/build/glibc-2.12.1'
make: *** [all] Error 2


会有很多文件缺失的错误。被老外不少馊主意比如说cp -r arch/arm/include include之类的小坑了一下。
sysdeps/unix/sysv/linux/sys/syscall.h:25:24: fatal error:
asm/unistd.h: No such file or directory
compilation terminated.




感谢:http://hezhao2000.blog.163.com/blog/static/1224363672012101253110848/     在路上。。。








关于:--enable-add-on=nptl 选项 说明:http://blog.csdn.net/guosha/article/details/2960186

 POSIX Thread Library (NPTL)使Linux内核可以非常有效的运行使用POSIX线程标准写的程序。

这里有一个测试数据,在32位机下,NPTL成功启动100000个线程只用了2秒,而不使用NPTL将需要大约15分钟左右的时间。

历史


在内核2.6以前的调度实体都是进程,内核并没有真正支持线程。它是能过一个系统调用clone()来实现的,这个调用创建了一份调用进程的拷贝,跟fork()不同的是,这份进程拷贝完全共享了调用进程的地址空间。LinuxThread就是通过这个系统调用来提供线程在内核级的支持的(许多以前的线程实现都完全是在用户态,内核根本不知道线程的存在)。非常不幸的是,这种方法有相当多的地方没有遵循POSIX标准,特别是在信号处理,调度,进程间通信原语等方面。

很显然,为了改进LinuxThread必须得到内核的支持,并且需要重写线程库。为了实现这个需求,开始有两个相互竞争的项目:IBM启动的NGTP(Next Generation POSIX Threads)项目,以及Redhat公司的NPTL。在2003年的年中,IBM放弃了NGTP,也就是大约那时,Redhat发布了最初的NPTL。

NPTL最开始在redhat linux 9里发布,现在从RHEL3起内核2.6起都支持NPTL,并且完全成了GNU C库的一部分。

 

设计

 

NPTL使用了跟LinuxThread相同的办法,在内核里面线程仍然被当作是一个进程,并且仍然使用了clone()系统调用(在NPTL库里调用)。但是,NPTL需要内核级的特殊支持来实现,比如需要挂起然后再唤醒线程的线程同步原语futex.

NPTL也是一个1*1的线程库,就是说,当你使用pthread_create()调用创建一个线程后,在内核里就相应创建了一个调度实体,在linux里就是一个新进程,这个方法最大可能的简化了线程的实现。

除NPTL的1*1模型外还有一个m*n模型,通常这种模型的用户线程数会比内核的调度实体多。在这种实现里,线程库本身必须去处理可能存在的调度,这样在线程库内部的上下文切换通常都会相当的快,因为它避免了系统调用转到内核态。然而这种模型增加了线程实现的复杂性,并可能出现诸如优先级反转的问题,此外,用户态的调度如何跟内核态的调度进行协调也是很难让人满意。







### 回答1: 根据问题描述,"compat-libstdc++-33-3.2.3-72.el7-x86_64"软件包无法安装,错误信息中提到"glibc-kernheaders"未安装。这个问题可能是由于缺少"glibc-kernheaders"软件包导致的。 "glibc-kernheaders"是一种包含内核标头文件的软件包,这些标头文件对于构建和编译一些软件或驱动程序是必需的。 要解决这个问题,可以尝试以下步骤: 1. 确认您的系统上是否有可用的"glibc-kernheaders"软件包。可以通过运行以下命令来检查: yum list glibc-kernheaders 如果该软件包未安装,会显示"未安装"的提示。 2. 如果发现"glibc-kernheaders"未安装,请运行以下命令安装该软件包: yum install glibc-kernheaders 这将从yum存储库中下载并安装相应的软件包。 3. 安装完成后,再次尝试安装"compat-libstdc++-33-3.2.3-72.el7-x86_64"软件包: yum install compat-libstdc++-33-3.2.3-72.el7-x86_64 这将尝试安装该软件包及其依赖项。 4. 如果仍然遇到问题,请确保您的系统连接到正确的软件存储库,并能够正常访问互联网。您还可以尝试更新您的系统软件包: yum update 这将更新您的系统软件包到最新版本,可能会解决一些依赖性问题。 总之,确保安装了"glibc-kernheaders"软件包并保持系统软件包更新是解决该问题的关键。 ### 回答2: 根据提供的信息,似乎是在安装或更新软件时出现了问题。"compat-libstdc++-33-3.2.3-72.el7-x86_64"和"glibc-kernheaders"是两个软件包的名称,而错误信息指出"glibc-kernheaders"未安装。 "glibc-kernheaders"是GNU C库的内核头文件,它是许多软件包的依赖项。缺少此软件包可能会导致其他软件无法正常工作。 要解决这个问题,我们可以尝试以下步骤: 1. 使用以下命令更新系统的软件包列表: ``` sudo yum update ``` 2. 确保系统与软件源保持连接,并尝试重新安装"glibc-kernheaders": ``` sudo yum install glibc-kernheaders ``` 3. 如果第二步没有成功,可以尝试使用 "-y" 参数强制安装,并检查是否有其他依赖项没有安装: ``` sudo yum install -y glibc-kernheaders ``` 4. 如果仍然无法解决问题,可能需要更新软件源配置或确保网络连接正常,然后重试上述步骤。 此外,如果您只是想使用"compat-libstdc++-33-3.2.3-72.el7-x86_64"软件包,您可以在不安装"glibc-kernheaders"的情况下继续,并尝试查找其他解决方案或软件包。但请注意,这可能会导致其他依赖项问题。最佳做法是尽可能满足所有软件包的依赖项。 希望以上信息对您有帮助,如果仍有疑问,请给出更多详细信息以便我们能够更准确地回答。 ### 回答3: "compat-libstdc++-33-3.2.3-72.el7-x86_64"软件包是Linux操作系统中的一个库。它是为了解决旧版操作系统与新版应用程序之间的兼容性问题而开发的。 "glibc-kernheaders"是一个用于开发过程中的头文件集合。它包含了与操作系统内核交互所需的函数和数据结构的定义。这些头文件在编写系统级应用程序或内核模块时非常有用。 回到问题,错误消息"glibc-kernheaders is not ins"可能表示"glibc-kernheaders"软件包没有安装在系统中。在安装"compat-libstdc++-33-3.2.3-72.el7-x86_64"之前,系统检测到缺少"glibc-kernheaders"软件包,并给出了一个相应的错误提示。 解决此问题的方法是安装"glibc-kernheaders"软件包。你可以使用操作系统的软件包管理工具(如yum或apt-get)来安装它。例如,如果你使用的是CentOS 7操作系统,你可以通过运行以下命令来安装该软件包: sudo yum install glibc-kernheaders 这将下载并安装"glibc-kernheaders"软件包。安装完成后,你可以再次尝试安装"compat-libstdc++-33-3.2.3-72.el7-x86_64"软件包,应该不会再出现相同的错误提示。 希望这能解决你的问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值