1.glibc源码分析(二)系统调用
2.Linuxä¸ç交åç¼è¯ç¯å¢è®¾ç½®
3.Linux|如何安装和运行多个 glibc 库
4.å¦ä½å®è£
glibc-2.15.tar
glibc源码分析(二)系统调用
在glibc源码中,源码许多系统调用被使用了.c封装的编译方式进行封装。这一过程借助嵌入式汇编,源码严格遵循系统调用封装规则。编译以stat函数为例,源码其实现揭示了.c封装的编译图书登记源码奥秘。
在源代码中,源码stat系统调用被INLINE_SYSCALL宏所封装。编译该宏首先调用INTERNAL_SYSCALL宏,源码执行系统调用并把返回值存入resultvar变量中。编译接下来,源码通过判断系统调用是编译否成功执行,采取相应的源码后续操作。若执行错误,编译则调用__syscall_error设置errno并返回-1;若执行成功,源码则返回resultvar。
在处理系统调用参数个数nr时,INTERNAL_SYSCALL宏发挥了关键作用。根据nr的幸运宝藏源码不同,宏会调用不同的内部函数进行处理。例如,当nr为0时,调用INTERNAL_SYSCALL_MAIN_0宏,设置eax寄存器为系统调用号,执行*_dl_sysinfo函数进行系统调用。当nr为1时,宏将参数1存入ebx寄存器,同时设置eax寄存器为系统调用号,5050源码开发并执行系统调用。
类似的,nr为2、3、4、5或6时,宏分别会将参数2至6存入ecx、edx、esi、云科技源码edi或ebp寄存器中,并与系统调用号相结合,执行*_dl_sysinfo函数。通过这一系列的嵌入式汇编操作,.c文件成功封装了系统调用,实现了高效、精确的调用过程。
总的来说,glibc中.c封装的云 源码下载实现展示了汇编语言的强大功能,以及在系统调用处理中的应用。通过精确的汇编指令和灵活的参数传递,封装过程确保了系统调用的执行效率和正确性。
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
åºå·²ç»ç¼å¥½äºï¼ä½æ¯ä¸è½ç´æ¥ä½¿ç¨ï¼å¿ é¡»åç¨æ°çåºéç¼ä¸éç¼è¯å¨æè¡ã
ä¸ä¸ç¯