欢迎来到皮皮网官网

【obs源码修改】【linux源码分层】【netcore源码编译】libc 源码编译

时间:2024-12-24 02:48:45 来源:c++ 网游 源码

1.glibc源码分析(二)系统调用
2.Linux下的交叉编译环境设置
3.Linux|如何安装和运行多个 glibc 库
4.如何安装 glibc-2.15.tar

libc 源码编译

glibc源码分析(二)系统调用

       在glibc源码中,源码许多系统调用被使用了.c封装的编译方式进行封装。这一过程借助嵌入式汇编,源码严格遵循系统调用封装规则。编译以stat函数为例,源码其实现揭示了.c封装的编译obs源码修改奥秘。

       在源代码中,源码stat系统调用被INLINE_SYSCALL宏所封装。编译该宏首先调用INTERNAL_SYSCALL宏,源码执行系统调用并把返回值存入resultvar变量中。编译接下来,源码通过判断系统调用是编译否成功执行,采取相应的源码后续操作。若执行错误,编译则调用__syscall_error设置errno并返回-1;若执行成功,源码则返回resultvar。

       在处理系统调用参数个数nr时,INTERNAL_SYSCALL宏发挥了关键作用。根据nr的linux源码分层不同,宏会调用不同的内部函数进行处理。例如,当nr为0时,调用INTERNAL_SYSCALL_MAIN_0宏,设置eax寄存器为系统调用号,执行*_dl_sysinfo函数进行系统调用。当nr为1时,宏将参数1存入ebx寄存器,同时设置eax寄存器为系统调用号,netcore源码编译并执行系统调用。

       类似的,nr为2、3、4、5或6时,宏分别会将参数2至6存入ecx、edx、esi、免费blog源码edi或ebp寄存器中,并与系统调用号相结合,执行*_dl_sysinfo函数。通过这一系列的嵌入式汇编操作,.c文件成功封装了系统调用,实现了高效、精确的调用过程。

       总的来说,glibc中.c封装的clickhouse的源码实现展示了汇编语言的强大功能,以及在系统调用处理中的应用。通过精确的汇编指令和灵活的参数传递,封装过程确保了系统调用的执行效率和正确性。

Linux下的交叉编译环境设置

       é‡‡ç”¨äº¤å‰ç¼–译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。

       linux下的交叉编译环境重要包括以下几个部分:

       1.对目标系统的编译器gcc

       2.对目标系统的二进制工具binutils

       3.目标系统的标准c库glibc

       4.目标系统的linux内核头文件

       äº¤å‰ç¼–译环境的建立步骤

       ä¸€ã€ä¸‹è½½æºä»£ç  下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。

       äºŒã€ç¼–译binutils 首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。

       ä¸‰ã€é…ç½®linux内核头文件

       é¦–先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp PDA,因而设置system type为SAX0,SAX0 Implementations中选择Compaq iPAQ H/H。

       é…ç½®å®Œæˆä¹‹åŽï¼Œéœ€è¦å°†å†…核头文件拷贝到安装目录: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux

       å››ã€ç¬¬ä¸€æ¬¡ç¼–译gcc

       é¦–先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。

       äº”、交叉编译glibc

       è¿™ä¸€æ­¥éª¤ç”Ÿæˆçš„代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。

       configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。

       å…­ã€ç¬¬äºŒæ¬¡ç¼–译gcc

       è¿è¡Œconfigure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。

       è¿è¡Œmake install。

       åˆ°æ­¤ä¸ºæ­¢æ•´ä¸ªäº¤å‰ç¼–译环境就完全生成了。

       å‡ ç‚¹æ³¨æ„äº‹é¡¹

       ç¬¬ä¸€ç‚¹ã€åœ¨ç¬¬ä¸€æ¬¡ç¼–译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。

Linux|如何安装和运行多个 glibc 库

       在Linux环境中,遇到需要支持不同应用程序或保持与旧软件兼容性的情况时,如何安装和管理多个glibc库就显得尤为重要。本文将引导您通过几个简单步骤来实现这一目标。

       首要任务是确定为何需要多个glibc版本,通常是由于特定应用程序要求旧版本库中的特定功能或特性。在安装之前,确保系统是最新的,并根据您的发行版(Debian或Red Hat)准备相应的软件包或开发工具包。

       首先,从官方库或可信源下载所需的glibc版本,如glibc 2.和2.。使用wget命令下载并解压源代码,创建包含glibc源代码的目录。然后,进入该目录并配置构建环境,执行编译安装,这样可以避免库之间的冲突。

       安装后,管理多个glibc版本的关键在于设置LD_LIBRARY_PATH环境变量,这有助于指定应用程序使用特定版本的库。将相关设置添加到bashrc或profile文件中,确保更改持久生效。最后,检查每个版本的glibc是否正确安装。

       运行依赖特定glibc版本的应用程序时,使用LD_PRELOAD环境变量。例如,若要使用glibc 2.,只需设置相应的LD_PRELOAD值。通过这些步骤,您可以在Linux系统上顺利安装和运行需要不同glibc版本的应用程序,同时保持系统的库环境整洁。

如何安装 glibc-2..tar

       ç¼–译步骤:

       ä¸‹è½½glibc-2..tar.gz和补丁包glibc-ports-2..tar.gz

       è§£åŽ‹

       $mv glibc-ports-2. glibc-2./ports

       $mkdir glibc-build-2. &&cd glibc-build-2.

       $ ../glibc-2./configure \

        --prefix=/usr/local/glibc_mips \

        CC=mipsel-linux-gcc \

        --host=mipsel-linux \

        --build=i-pc-linux-gnu \

        --enable-add-on=nptl \

        libc_cv_forced_unwind=yes \

        libc_cv_c_cleanup=yes \

        libc_cv_mips_tls=yes \

        libc_cv_gnu_inline=yes

       ok,没问题

       $make &&make install

       å¤§åŠŸå‘Šæˆ

       ##########################################################################

       ä¸‹é¢æ˜¯æˆ‘编译时的过程和遇到的问题及解决:

       ##########################################################################

       $tar xvf glibc-2..0.tar.bz2

       $cd glibc-2..0

       $./configure --prefix=/usr/local/glibc //先不加其他选项,除了安装路径,一切默认,网上一般配置arm的选项如下 --prefix=$HOME/usr/arm --with-headers=$HOME/usr/arm/glibc/arm-linux-glibc/include --with-libs=$HOME/usr/arm/glibc/arm-linux-glibc/lib

       æŠ¥é”™ï¼š

       configure: error: you must configure in a separate build directory

       å¾ˆå¥‡æ€ªçš„问题,必须配置一个构建目录,刚开始以为是安装目录为创建

       $mkdir /usr/local/glibc

       é—®é¢˜ä»ç„¶å­˜åœ¨ï¼Œç™¾åº¦ä¹‹

       $mkdir ../glibc-build && cd ../glibc-build

       $../glibc-2..0/configure --prefix=/usr/local/glibc

       å‡ºçŽ°æ–°çš„问题:

       configure: WARNING:

       *** These auxiliary programs are missing or incompatible versions: msgfmt

       *** some features will be disabled.

       *** Check the INSTALL file for required versions.

       checking LD_LIBRARY_PATH variable... contains current directory

       configure: error:

       *** LD_LIBRARY_PATH shouldn't contain the current directory when

       *** building glibc. Please change the environment variable

       *** and run configure again.

       ç¬¬ä¸€ä¸ªè­¦å‘Šä¸ç”¨ç®¡å®ƒï¼Œç¬¬äºŒä¸ªLD_LIBRARY_PATY也会有错?我的这个路径用了多少天了。仔细看提示,不应包含当前路径。打开~/.bash_profile

       $cat ~/.bash_profile

       export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib export LD_LIBRARY_PATH

       è¿™ä¹Ÿæ²¡å½“前路径啊。还是百度吧。

       ä¸€ä¸ªå…„弟的解释是这样“LD_LIBRARY_PATH不能以终结符作为开始和最后一个字符,不能有2个终结符连在一起,我的LD_LIBRARY_PATH为 :/usr/local/firefox:/usr/local/firefox,只要在前面加上一个路径,不让:出现在第一个字符就可以了 ”

       åŽŸæ¥å¦‚此,第一个字符不能是":",修改~/.bash_profile

       export LD_LIBRARY_PATH=/usr/local/lib export LD_LIBRARY_PATH

       $../glibc-2..0/configure --prefix=/usr/local/glibc

       ls一下,发现,当前目录生成了Makefile等一堆东西

       $make && make install

       æ²¡é—®é¢˜

       ä¸‹ä¸€æ­¥å¼€å§‹äº¤å‰ç¼–译

       $mkdir ../glibc-build-mips && cd ../glibc-build-mips

       $ ../glibc-2..0/configure --prefix=/usr/local/glibc_mips CC=mipsel-linux-gcc --host=mips

       å‡ºçŽ°æ–°çš„问题:

       configure: running configure fragment for add-on libidn

       configure: running configure fragment for add-on nptl

       *** The GNU C library is currently not available for this platform.

       *** So far nobody cared to port it and if there is no volunteer it

       *** might never happen. So, if you have interest to see glibc on

       *** this platform visit

       *** piler. */

       # if !defined __CHAR_TYPE__ || !defined __CHAR_TYPE__

       # if defined __STDC_VERSION__ && __STDC_VERSION__ < L

       # error "<uchar.h> requires ISO C mode"

       # else

       # error "definitions of __CHAR_TYPE__ and/or __CHAR_TYPE__ missing"

       # endif

       # endif

       æ˜Žç™½äº†ï¼ŒåŽŸæ¥æ˜¯éœ€è¦c支持,mipsel-linux-gcc -v一下,我的支持c.原来如此。暂时没招了,我还做不到修改c的支持,只剩两个办法,不用这个glibc版本或者重新编译一个支持c的交叉编译器。编译器需要做的比较多,暂时先换个低点的版本吧。

       ä¸‹è½½galibc-2.版本

       é‡å¤ä¸Šé¢æ­¥éª¤ï¼Œè§£åŽ‹tar包

       è§£åŽ‹ports包

       $mv glibc-ports-2. glibc-2./ports

       $mkdir glibc-build-2. &&cd glibc-build-2.

       $ ../glibc-2./configure \

        --prefix=/usr/local/glibc_mips \

        CC=mipsel-linux-gcc \

        --host=mipsel-linux \

        --build=i-pc-linux-gnu \

        --enable-add-on=nptl \

        libc_cv_forced_unwind=yes \

        libc_cv_c_cleanup=yes \

        libc_cv_mips_tls=yes \

        libc_cv_gnu_inline=yes

       ok,没问题

       $make &&make install

       åº“已经编好了,但是不能直接使用,必须再用新的库重编一遍编译器才行。

       ä¸Šä¸€ç¯‡

copyright © 2016 powered by 皮皮网   sitemap