1.为什么GCC、源码GLIBC、源码libstdc++ not found?
2.å¦ä½ä¸ºåµå
¥å¼å¼å建ç«äº¤åç¼è¯ç¯å¢
3.Linuxä¸ç交åç¼è¯ç¯å¢è®¾ç½®
4.å¦ä½å¶ä½arm-linux-gccç¼è¯å·¥å
·
5.升级 GLIBC 后想回退,源码遇到 __resolv_context_ 相关符号报错
6.Linux 调试秘籍深入探索 C++运行时获取堆栈信息和源代码行数的源码终极指南
为什么GCC、GLIBC、源码libstdc++ not found?
GLIBCXX not found
相关报错处理方式:
1. 需要确认所使用的源码放置江湖mud源码库文件是否存在于系统中,通常通过运行 `ldd` 命令查看程序依赖的源码动态库。如果出现类似`/usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.' not found (required by ./xxx)`的源码错误信息,说明缺少特定版本的源码GLIBCXX库。
处理方法如下:
2. **源码编译更新gcc
**3. **下载官方包复制
**4. **手动编译复制
**GLIBC not found
相关错误信息示例:
若报错信息为`/lib/libc.so.6: version 'GLIBC_2.' not found (required by /lib/libstdc++.so.6)`,源码则表明缺少特定版本的源码GLIBC库。
处理方法有以下几种:
2. **源码编译更新gcc
**3. **下载官方包复制
**4. **手动编译复制
**gcc
gcc 是源码 GNU Compiler Collection 的简称,用于将c/c++源代码编译为不同操作系统平台的源码汇编代码和可执行程序。
gcc 是源码一组编译工具的集合,主要负责预处理和编译任务,源码自动调用汇编器和链接器,提供与编译器紧密相关的运行库支持。
glibc
glibc 是 GNU 实现的标准 C 库,提供操作系统级的底层函数和核心API,如I/O设备操作。8口短信猫源码
glibc 包含多个头文件,每个文件定义一组相关设施。
libstdc++
libstdc++ 类似于 glibc,但针对 C++ 标准库。
提供与标准 C 库相同的核心定义和底层功能,以及 C++ 标准库的实现,用于实现 C++ 程序中的库内容,如线程、流、文件、输入/输出等。
大多数 Linux 发行版默认使用 libstdc++。
ABI
标准库的一个关键方面是 Application Binary Interface (ABI),它确保了编写的 C 程序能在不同版本的 glibc 上运行。
为了改进而不破坏兼容性,glibc 使用符号版本控制,每个函数与特定版本关联,允许新版本的程序使用新符号,而旧版本的javaee进销存源码程序仍能使用旧但兼容的符号。
binutils 是将汇编语言翻译为目标代码的程序,与标准库之间存在密切关系。
GNU C 函数库为开发者提供了便利,便于使用 C 语言开发基于 Linux 操作系统的程序。
glibc 是 Linux 下的 C 标准库实现,是 GNU C Library 的一部分,已成为 Linux 的主要 C 库之一。
相关命令
使用 `ldd` 命令查看程序依赖的动态库。
通过 `strings /lib/libc.so.6 | grep GLIBC_` 查看系统 GLIBC 支持的版本。
通过 `strings /usr/lib/libstdc++.so.6 | grep GLIBCXX` 查看系统 GLIBCXX 支持的版本。
使用 `readelf` 命令可以检查应用程序或库所需的 GLIBC 或 GLIBCXX 版本。
å¦ä½ä¸ºåµå ¥å¼å¼å建ç«äº¤åç¼è¯ç¯å¢
ããä¸é¢æ们å°ä»¥å»ºç«é对armç交åç¼è¯å¼åç¯å¢ä¸ºä¾æ¥è§£è¯´æ´ä¸ªè¿ç¨ï¼å ¶ä»çä½ç³»ç»æä¸è¿ä¸ªç¸ç±»ä¼¼ï¼åªè¦ä½ä¸äºå¯¹åºçæ¹å¨ãæçå¼åç¯å¢æ¯ï¼å®¿ä¸»æº i-redhat-7.2ï¼ç®æ æº armã
ããè¿ä¸ªè¿ç¨å¦ä¸
ãã1. ä¸è½½æºæ件ãè¡¥ä¸å建ç«ç¼è¯çç®å½
ãã2. 建ç«å æ ¸å¤´æ件
ãã3. 建ç«äºè¿å¶å·¥å ·ï¼binutilsï¼
ãã4. 建ç«åå§ç¼è¯å¨ï¼bootstrap gccï¼
ãã5. 建ç«cåº(glibc)
ãã6. 建ç«å ¨å¥ç¼è¯å¨ï¼full gccï¼
ããä¸è½½æºæ件ãè¡¥ä¸å建ç«ç¼è¯çç®å½
ãã1. éå®è½¯ä»¶çæ¬å·
ããéæ©è½¯ä»¶çæ¬å·æ¶ï¼å ççglibcæºä»£ç ä¸çINSTALLæ件ãé£éå举äºè¯¥çæ¬çglibcç¼è¯æ¶æéçbinutils ågccççæ¬å·ãä¾å¦å¨ glibc-2.2.3/INSTALL æ件ä¸æ¨è gcc ç¨ 2.以ä¸ï¼binutils ç¨ 2..1 以ä¸çæ¬ã
ããæéçå个软件ççæ¬æ¯ï¼
ããlinux-2.4.+rmk2
ããbinutils-2..1
ããgcc-2..3
ããglibc-2.2.3
ããglibc-linuxthreads-2.2.3
ããå¦æä½ éçglibcççæ¬å·ä½äº2.2ï¼ä½ è¿è¦ä¸è½½ä¸ä¸ªå«glibc-cryptçæ件ï¼ä¾å¦glibc-crypt-2.1.tar.gzã Linux å æ ¸ä½ å¯ä»¥ä»www.kernel.org æå®çéåä¸è½½ã
ããBinutilsãgccåglibcä½ å¯ä»¥ä»FSFçFTPç«ç¹ftp://ftp.gun.org/gnu/ æå®çéåå»ä¸è½½ã å¨ç¼è¯glibcæ¶ï¼è¦ç¨å° Linux å æ ¸ä¸ç include ç®å½çå æ ¸å¤´æ件ãå¦æä½ åç°æåé没æå®ä¹è导è´ç¼è¯å¤±è´¥ï¼ä½ å°±æ¹åä½ çå æ ¸çæ¬å·ãä¾å¦æå¼å§ç¨linux-2.4.+vrs2ï¼ç¼è¯glibc-2.2.3 æ¶æ¥ BUS_ISA 没å®ä¹ï¼åæ¥åç°å¨ 2.4. å¼å§å®çåå被æ¹ä¸º CTL_BUS_ISAãå¦æä½ æ²¡æå®å ¨çææ¡ä¿è¯ä½ æ¹çå æ ¸æ¹å®å ¨äºï¼å°±ä¸è¦å¨å æ ¸ï¼èæ¯æä½ ç Linux å æ ¸ççæ¬å·éä½æåé«ï¼æ¥éåº glibcã
ããGcc ççæ¬å·ï¼æ¨èç¨ gcc-2. 以ä¸çã太èççæ¬ç¼è¯å¯è½ä¼åºé®é¢ãGcc-2..3 æ¯ä¸ä¸ªæ¯è¾ç¨³å®ççæ¬ï¼ä¹æ¯å æ ¸å¼å人åæ¨èç¨çä¸ä¸ª gcc çæ¬ã
ããå¦æä½ åç°æ æ³ç¼è¯è¿å»ï¼æå¯è½æ¯ä½ éç¨ç软件ä¸æçå å ¥äºä¸äºæ°çç¹æ§èå ¶ä»æé软件ä¸æ¯æçåå ï¼å°±ç¸åºéä½è¯¥è½¯ä»¶ççæ¬å·ãä¾å¦æå¼å§ç¨ gcc-3.3.2ï¼åç°ç¼è¯ä¸è¿ï¼æ¥ asãld ççæ¬å¤ªèï¼æå°±æ gcc é为 2..3ã 太æ°ççæ¬å¤§å¤æ²¡ç»è¿å¤§éçæµè¯ï¼å»ºè®®ä¸è¦éç¨ã
ããå页é¦
ãã2. 建ç«å·¥ä½ç®å½
ããé¦å ï¼æ们建ç«å 个ç¨æ¥å·¥ä½çç®å½ï¼
ããå¨ä½ çç¨æ·ç®å½ï¼æç¨çæ¯ç¨æ·liangï¼å æ¤ç¨æ·ç®å½ä¸º /home/liangï¼å 建ç«ä¸ä¸ªé¡¹ç®ç®å½embeddedã
ãã$pwd
ãã/home/liang
ãã$mkdir embedded
ããåå¨è¿ä¸ªé¡¹ç®ç®å½ embedded ä¸å»ºç«ä¸ä¸ªç®å½ build-toolsãkernel å toolsã
ããbuild-tools-ç¨æ¥åæ¾ä½ ä¸è½½ç binutilsãgcc å glibc çæºä»£ç åç¨æ¥ç¼è¯è¿äºæºä»£ç çç®å½ã
ããkernel-ç¨æ¥åæ¾ä½ çå æ ¸æºä»£ç åå æ ¸è¡¥ä¸ã
ããtools-ç¨æ¥åæ¾ç¼è¯å¥½ç交åç¼è¯å·¥å ·ååºæ件ã
ãã$cd embedded
ãã$mkdir build-tools kernel tools
ããæ§è¡å®åç®å½ç»æå¦ä¸ï¼
ãã$ls embedded
ããbuild-tools kernel tools
ãã3. è¾åºåç¯å¢åé
ããæ们è¾åºå¦ä¸çç¯å¢åéæ¹ä¾¿æ们ç¼è¯ã
ãã$export PRJROOT=/home/liang/embedded
ãã$export TARGET=arm-linux
ãã$export PREFIX=$PRJROOT/tools
ãã$export TARGET_PREFIX=$PREFIX/$TARGET
ãã$export PATH=$PREFIX/bin:$PATH
ããå¦æä½ ä¸æ¯ç¨ç¯å¢åéçï¼ä½ å¯ä»¥ç´æ¥ç¨ç»å¯¹æç¸å¯¹è·¯å¾ãæå¦æä¸ç¨ç¯å¢åéï¼ä¸è¬é½ç¨ç»å¯¹è·¯å¾ï¼ç¸å¯¹è·¯å¾ææ¶ä¼å¤±è´¥ãç¯å¢åéä¹å¯ä»¥å®ä¹å¨.bashrcæ件ä¸ï¼è¿æ ·å½ä½ logoutææ¢äºæ§å¶å°æ¶ï¼å°±ä¸ç¨èæ¯exportè¿äºåéäºã
ããä½ç³»ç»æåä½ çTAEGETåéç对åºå¦ä¸è¡¨
ããä½ å¯ä»¥å¨éè¿glibcä¸çconfig.subèæ¬æ¥ç¥éï¼ä½ çTARGETåéæ¯å¦è¢«æ¯æï¼ä¾å¦ï¼
ãã$./config.sub arm-linux
ããarm-unknown-linux-gnu
ããå¨æçç¯å¢ä¸ï¼config.sub å¨ glibc-2.2.3/scripts ç®å½ä¸ã
ããç½ä¸è¿æä¸äº HOWTO å¯ä»¥åèï¼ARM ä½ç³»ç»æçãThe GNU Toolchain for ARM Target HOWTOãï¼PowerPC ä½ç³»ç»æçãLinux for PowerPC Embedded Systems HOWTOãçã对TARGETçéåå¯è½æ帮å©ã
ãã4. 建ç«ç¼è¯ç®å½
ãã为äºææºç åç¼è¯æ¶çæçæ件åå¼ï¼ä¸è¬çç¼è¯å·¥ä½ä¸å¨çæºç ç®å½ä¸ï¼è¦å¦å»ºä¸ä¸ªç®å½æ¥ä¸é¨ç¨äºç¼è¯ãç¨ä»¥ä¸çå½ä»¤æ¥å»ºç«ç¼è¯ä½ ä¸è½½çbinutilsãgccåglibcçæºä»£ç çç®å½ã
ãã$cd $PRJROOT/build-tools
ãã$mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch
ããbuild-binutils-ç¼è¯binutilsçç®å½
ããbuild-boot-gcc-ç¼è¯gcc å¯å¨é¨åçç®å½
ããbuild-glibc-ç¼è¯glibcçç®å½
ããbuild-gcc-ç¼è¯gcc å ¨é¨çç®å½
ããgcc-patch-æ¾gccçè¡¥ä¸çç®å½
ããgcc-2..3 çè¡¥ä¸æ gcc-2..3-2.patchãgcc-2..3-no-fixinc.patch ågcc-2..3-returntype-fix.patchï¼å¯ä»¥ä» http://www.linuxfromscratch.org/ ä¸è½½å°è¿äºè¡¥ä¸ã
ããåå°ä½ ä¸è½½ç binutils-2..1ãgcc-2..3ãglibc-2.2.3 å glibc-linuxthreads-2.2.3 çæºä»£ç æ¾å ¥ build-tools ç®å½ä¸
ããçä¸ä¸ä½ ç build-tools ç®å½ï¼æ以ä¸å 容ï¼
ãã$ls
ããbinutils-2..1.tar.bz2 build-gcc gcc-patch
ããbuild-binutls build-glibc glibc-2.2.3.tar.gz
ããbuild-boot-gcc gcc-2..3.tar.gz glibc-linuxthreads-2.2.3.tar.gz
ããå页é¦
ãã建ç«å æ ¸å¤´æ件
ããæä½ ä» www.kernel.org ä¸è½½çå æ ¸æºä»£ç æ¾å ¥ $PRJROOT /kernel ç®å½
ããè¿å ¥ä½ ç kernel ç®å½ï¼
ãã$cd $PRJROOT /kernel
ãã解å¼å æ ¸æºä»£ç
ãã$tar -xzvf linux-2.4..tar.gz
ããæ
ãã$tar -xjvf linux-2.4..tar.bz2
ããå°äº 2.4. çå æ ¸çæ¬è§£å¼ä¼çæä¸ä¸ª linux ç®å½ï¼æ²¡å¸¦çæ¬å·ï¼å°±å°å ¶æ¹åã
ãã$mv linux linux-2.4.x
ããç» Linux å æ ¸æä¸ä½ çè¡¥ä¸
ãã$cd linux-2.4.
ãã$patch -p1 < ../patch-2.4.-rmk2
ããç¼è¯å æ ¸çæ头æ件
ãã$make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
ããä½ ä¹å¯ä»¥ç¨ config å xconfig æ¥ä»£æ¿ menuconfigï¼ä½è¿æ ·ç¨å¯è½ä¼æ²¡æ设置æäºé ç½®æ件é项å没æçæä¸é¢ç¼è¯æéç头æ件ãæ¨èå¤§å®¶ç¨ make menuconfigï¼è¿ä¹æ¯å æ ¸å¼å人åç¨çæå¤çé ç½®æ¹æ³ãé ç½®å®éåºå¹¶ä¿åï¼æ£æ¥ä¸ä¸çå æ ¸ç®å½ä¸ç include/linux/version.h å include/linux/autoconf.h æ件æ¯ä¸æ¯çæäºï¼è¿æ¯ç¼è¯ glibc æ¯è¦ç¨å°çï¼version.h å autoconf.h æ件çåå¨ï¼ä¹è¯´æäºä½ çæäºæ£ç¡®ç头æ件ã
ããè¿è¦å»ºç«å 个æ£ç¡®çé¾æ¥
ãã$cd include
ãã$ln -s asm-arm asm
ãã$cd asm
ãã$ln -s arch-epxa arch
ãã$ln -s proc-armv proc
ããæ¥ä¸æ¥ä¸ºä½ ç交åç¼è¯ç¯å¢å»ºç«ä½ çå æ ¸å¤´æ件çé¾æ¥
ãã$mkdir -p $TARGET_PREFIX/include
ãã$ln -s $PRJROOT/kernel/linux-2.4./include/linux $TARGET_PREFIX/include/linux
ãã$in -s $PRJROOT/kernel/linux-2.4./include/asm-arm $TARGET_PREFIX/include/asm
ããä¹å¯ä»¥æ Linux å æ ¸å¤´æ件æ·è´è¿æ¥ç¨
ãã$mkdir -p $TARGET_PREFIX/include
ãã$cp -r $PRJROOT/kernel/linux-2.4./include/linux $TARGET_PREFIX/include
ãã$cp -r $PRJROOT/kernel/linux-2.4./include/asm-arm $TARGET_PREFIX/include
ããå页é¦
ãã建ç«äºè¿å¶å·¥å ·ï¼binutilsï¼
ããbinutilsæ¯ä¸äºäºè¿å¶å·¥å ·çéåï¼å ¶ä¸å å«äºæ们常ç¨å°çasåldã
ããé¦å ï¼æ们解åæ们ä¸è½½çbinutilsæºæ件ã
ãã$cd $PRJROOT/build-tools
ãã$tar -xvjf binutils-2..1.tar.bz2
ããç¶åè¿å ¥build-binutilsç®å½é ç½®åç¼è¯binutilsã
ãã$cd build-binutils
ãã$../binutils-2..1/configure --target=$TARGET --prefix=$PREFIX
ãã--target é项æ¯æåºæ们çæçæ¯ arm-linux çå·¥å ·ï¼--prefix æ¯æåºæ们å¯æ§è¡æ件å®è£ çä½ç½®ã
ããä¼åºç°å¾å¤ checkï¼æå产ç Makefile æ件ã
ããæäº Makefile åï¼æ们æ¥ç¼è¯å¹¶å®è£ binutilsï¼å½ä»¤å¾ç®åã
ãã$make
ãã$make install
ããçä¸ä¸æ们 $PREFIX/bin ä¸ççæçæ件
ãã$ls $PREFIX/bin
ããarm-linux-addr2line arm-linux-gasp arm-linux-objdump arm-linux-strings
ããarm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip
ããarm-linux-as arm-linux-nm arm-linux-readelf
ããarm-linux-c++filt arm-linux-objcopy arm-linux-size
ããæ们æ¥è§£éä¸ä¸ä¸é¢çæçå¯æ§è¡æ件é½æ¯ç¨æ¥å¹²ä»ä¹ç
ããadd2line - å°ä½ è¦æ¾çå°å转ææ件åè¡å·ï¼å®è¦ä½¿ç¨ debug ä¿¡æ¯ã
ããAr-产çãä¿®æ¹å解å¼ä¸ä¸ªåæ¡£æ件
ããAs-gnu çæ±ç¼å¨
ããC++filt-C++ å java ä¸æä¸ç§éè½½å½æ°ï¼æç¨çéè½½å½æ°æåä¼è¢«ç¼è¯è½¬åææ±ç¼çæ å·ï¼c++filt å°±æ¯å®ç°è¿ç§ååç转åï¼æ ¹æ®æ å·å¾å°å½æ°åã
ããGasp-gnu æ±ç¼å¨é¢ç¼è¯å¨ã
ããLd-gnu çè¿æ¥å¨
ããNm-ååºç®æ æ件ç符å·å对åºçå°å
ããObjcopy-å°æç§æ ¼å¼çç®æ æ件转åæå¦å¤æ ¼å¼çç®æ æ件
ããObjdump-æ¾ç¤ºç®æ æ件çä¿¡æ¯
ããRanlib-为ä¸ä¸ªåæ¡£æ件产çä¸ä¸ªç´¢å¼ï¼å¹¶å°è¿ä¸ªç´¢å¼åå ¥åæ¡£æ件ä¸
ããReadelf-æ¾ç¤º elf æ ¼å¼çç®æ æ件çä¿¡æ¯
ããSize-æ¾ç¤ºç®æ æ件å个èç大å°åç®æ æ件ç大å°
ããStrings-æå°åºç®æ æ件ä¸å¯ä»¥æå°çå符串ï¼æ个é»è®¤çé¿åº¦ï¼ä¸º4
ããStrip-å¥æç®æ æ件çææç符å·ä¿¡æ¯
ããå页é¦
ãã建ç«åå§ç¼è¯å¨ï¼bootstrap gccï¼
ããé¦å è¿å ¥ build-tools ç®å½ï¼å°ä¸è½½ gcc æºä»£ç 解å
ãã$cd $PRJROOT/build-tools
ãã$tar -xvzf gcc-2..3.tar.gz
ããç¶åè¿å ¥ gcc-2..3 ç®å½ç» gcc æä¸è¡¥ä¸
ãã$cd gcc-2..3
ãã$patch -p1< ../gcc-patch/gcc-2..3.-2.patch
ãã$patch -p1< ../gcc-patch/gcc-2..3.-no-fixinc.patch
ãã$patch -p1< ../gcc-patch/gcc-2..3-returntype-fix.patch
ããecho timestamp > gcc/cstamp-h.in
ããå¨æ们ç¼è¯å¹¶å®è£ gcc åï¼æ们å è¦æ¹ä¸ä¸ªæ件 $PRJROOT/gcc/config/arm/t-linuxï¼æ
ããTARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC
ããè¿ä¸è¡æ¹ä¸º
ããTARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h
ããä½ å¦æ没å®ä¹ -Dinhibitï¼ç¼è¯æ¶å°ä¼æ¥å¦ä¸çé误
ãã../../gcc-2..3/gcc/libgcc2.c:: stdlib.h: No such file or directory
ãã../../gcc-2..3/gcc/libgcc2.c:: unistd.h: No such file or directory
ããmake[3]: *** [libgcc2.a] Error 1
ããmake[2]: *** [stmp-multilib-sub] Error 2
ããmake[1]: *** [stmp-multilib] Error 1
ããmake: *** [all-gcc] Error 2
ããå¦æ没æå®ä¹ -D__gthr_posix_hï¼ç¼è¯æ¶ä¼æ¥å¦ä¸çé误
ããIn file included from gthr-default.h:1,
ããfrom ../../gcc-2..3/gcc/gthr.h:,
ããfrom ../../gcc-2..3/gcc/libgcc2.c::
ãã../../gcc-2..3/gcc/gthr-posix.h:: pthread.h: No such file or directory
ããmake[3]: *** [libgcc2.a] Error 1
ããmake[2]: *** [stmp-multilib-sub] Error 2
ããmake[1]: *** [stmp-multilib] Error 1
ããmake: *** [all-gcc] Error 2
ããè¿æä¸ç§ä¸-Dinhibitåçææçæ¹æ³ï¼é£å°±æ¯å¨ä½ é ç½®configureæ¶å¤å ä¸ä¸ªåæ°-with-newlibï¼è¿ä¸ªé项ä¸ä¼è¿«ä½¿æä»¬å¿ é¡»ä½¿ç¨newlibãæ们ç¼è¯äºbootstrap-gccåï¼ä»ç¶å¯ä»¥éæ©ä»»ä½cåºã
ããæ¥çå°±æ¯é ç½®boostrap gccï¼ åé¢è¦ç¨bootstrap gcc æ¥ç¼è¯ glibc åºã
ãã$cd ..; cd build-boot-gcc
ãã$../gcc-2..3/configure --target=$TARGET --prefix=$PREFIX \
ãã>--without-headers --enable-languages=c --disable-threads
ããè¿æ¡å½ä»¤ä¸ç -targetã--prefix åé ç½® binutils çå«ä¹æ¯ç¸åçï¼--without-headers å°±æ¯æä¸éè¦å¤´æ件ï¼å 为æ¯äº¤åç¼è¯å·¥å ·ï¼ä¸éè¦æ¬æºä¸ç头æ件ã-enable-languages=cæ¯ææ们ç boot-gcc åªæ¯æ c è¯è¨ã--disable-threads æ¯å»æ thread åè½ï¼è¿ä¸ªåè½éè¦ glibc çæ¯æã
ããæ¥çæ们ç¼è¯å¹¶å®è£ boot-gcc
ãã$make all-gcc
ãã$make install-gcc
ããæ们æ¥çç $PREFIX/bin éé¢å¤äºåªäºä¸è¥¿
ãã$ls $PREFIX/bin
ããä½ ä¼åç°å¤äº arm-linux-gcc ãarm-linux-unprotoizeãcpp å gcov å 个æ件ã
ããGcc-gnu ç C è¯è¨ç¼è¯å¨
ããUnprotoize-å° ANSI C çæºç 转å为 K&R C çå½¢å¼ï¼å»æå½æ°ååä¸çåæ°ç±»åã
ããCpp-gnuç C çé¢ç¼è¯å¨
ããGcov-gcc çè¾ å©æµè¯å·¥å ·ï¼å¯ä»¥ç¨å®æ¥åæåä¼ç¨åºã
ããä½¿ç¨ gcc3.2 以å gcc3.2 以ä¸çæ¬æ¶ï¼é ç½® boot-gcc ä¸è½ä½¿ç¨ --without-headers é项ï¼èéè¦ä½¿ç¨ glibc ç头æ件ã
ããå页é¦
ããå»ºç« c åº(glibc)
ããé¦å 解å glibc-2.2.3.tar.gz å glibc-linuxthreads-2.2.3.tar.gz æºä»£ç
ãã$cd $PRJROOT/build-tools
ãã$tar -xvzf glibc-2.2.3.tar.gz
ãã$tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3
ããç¶åè¿å ¥ build-glibc ç®å½é ç½® glibc
ãã$cd build-glibc
ãã$CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET --prefix="/usr"
ãã--enable-add-ons --with-headers=$TARGET_PREFIX/include
ããCC=arm-linux-gcc æ¯æ CC åé设æä½ åç¼è¯å®çboostrap gccï¼ç¨å®æ¥ç¼è¯ä½ çglibcã--enable-add-onsæ¯åè¯glibcç¨ linuxthreads å ï¼å¨ä¸é¢æ们已ç»å°å®æ¾å ¥äº glibc æºç ç®å½ä¸ï¼è¿ä¸ªé项çä»·äº -enable-add-ons=linuxthreadsã--with-headers åè¯ glibc æ们çlinux å æ ¸å¤´æ件çç®å½ä½ç½®ã
ããé ç½®å®åå°±å¯ä»¥ç¼è¯åå®è£ glibc
ãã$make
ãã$make install_root=$TARGET_PREFIX prefix="" install
ããç¶åä½ è¿è¦ä¿®æ¹ libc.so æ件
ããå°
ããGROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)
ããæ¹ä¸º
ããGROUP ( libc.so.6 libc_nonshared.a)
ããè¿æ ·è¿æ¥ç¨åº ld å°±ä¼å¨ libc.so æå¨çç®å½æ¥æ¾å®éè¦çåºï¼å ä¸ºä½ çæºåç/libç®å½å¯è½å·²ç»è£ äºä¸ä¸ªç¸åååçåºï¼ä¸ä¸ªä¸ºç¼è¯å¯ä»¥å¨ä½ ç宿主æºä¸è¿è¡çç¨åºçåºï¼èä¸æ¯ç¨äºäº¤åç¼è¯çã
ããå页é¦
ãã建ç«å ¨å¥ç¼è¯å¨ï¼full gccï¼
ããå¨å»ºç«boot-gcc çæ¶åï¼æ们åªæ¯æäºCãå°è¿éï¼æ们就è¦å»ºç«å ¨å¥ç¼è¯å¨ï¼æ¥æ¯æCåC++ã
ãã$cd $PRJROOT/build-tools/build-gcc
ãã$../gcc-2..3/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++
ãã--enable-languages=c,c++ åè¯ full gcc æ¯æ c å c++ è¯è¨ã
ããç¶åç¼è¯åå®è£ ä½ ç full gcc
ãã$make all
ãã$make install
ããæ们åæ¥çç $PREFIX/bin éé¢å¤äºåªäºä¸è¥¿
ãã$ls $PREFIX/bin
ããä½ ä¼åç°å¤äº arm-linux-g++ ãarm-linux-protoize å arm-linux-c++ å 个æ件ã
ããG++-gnuç c++ ç¼è¯å¨ã
ããProtoize-ä¸Unprotoizeç¸åï¼å°K&R Cçæºç 转å为ANSI Cçå½¢å¼ï¼å½æ°ååä¸å å ¥åæ°ç±»åã
ããC++-gnu ç c++ ç¼è¯å¨ã
ããå°è¿éä½ ç交åç¼è¯å·¥å ·å°±ç®åå®äºï¼ç®åéªè¯ä¸ä¸ä½ ç交åç¼è¯å·¥å ·ã
ããç¨å®æ¥ç¼è¯ä¸ä¸ªå¾ç®åçç¨åº helloworld.c
ãã#include <stdio.h>
ããint main(void)
ãã{
ããprintf("hello world\n");
ããreturn 0;
ãã}
ãã$arm-linux-gcc helloworld.c -o helloworld
ãã$file helloworld
ããhelloworld: ELF -bit LSB executable, ARM, version 1,
ããdynamically linked (uses shared libs), not stripped
ããä¸é¢çè¾åºè¯´æä½ ç¼è¯äºä¸ä¸ªè½å¨ arm ä½ç³»ç»æä¸è¿è¡ç helloworldï¼è¯æä½ çç¼è¯å·¥å ·åæåäºã
è½¬è½½ä» ä¾åèï¼çæå±äºåä½è
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ã
å¦ä½å¶ä½arm-linux-gccç¼è¯å·¥å ·
ä¸ãä¸è½½æºæ件
æºä»£ç æ件åå ¶çæ¬ï¼
binutils-2..tar.bz2, gcc-core-4.4.4.tar.bz2 gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6..tar.bz2 ï¼ç±äºæå¨ç¼è¯åºéçè¿ç¨ä¸ï¼æ ¹æ®åºéçä¿¡æ¯ä¿®æ¹äºç¸å ³çC代ç ï¼æ è没æä¸è½½ç¸åºçè¡¥ä¸ï¼
ä¸è¬ä¸ä¸ªå®æ´ç交åç¼è¯å¨æ¶åå°å¤ä¸ªè½¯ä»¶ï¼ä¸»è¦å æ¬bilingualsãccãglibcçãå ¶ä¸ï¼binutils主è¦çæä¸äºè¾ å©å·¥å ·ï¼gccæ¯ç¨æ¥çæ交åç¼è¯å¨ï¼ä¸»è¦çæarm-linux-gcc交åç¼è¯å·¥å ·ï¼èglibc主è¦æä¾ç¨æ·ç¨åºæéè¦çä¸äºåºæ¬å½æ°åºã
äºã建ç«å·¥ä½ç®å½
ç¼è¯æç¨ä¸»æºåå· fc.iï¼èææºéçæ¯VM7.0ï¼Linuxåè¡çéçæ¯Fedora9,
第ä¸æ¬¡ç¼è¯æ¶ç¨çæ¯rootç¨æ·ï¼ç¬¬äºæ¬¡ç¨ä¸è¬ç¨æ·yyzï¼, ææçå·¥ä½ç®å½é½å¨/home/yyz/crossä¸é¢å»ºç«å®æï¼é¦å å¨/home/yyzç®å½ä¸å»ºç«crossç®å½ï¼ç¶åè¿å ¥å·¥ä½ç®å½ï¼æ¥çå½åç®å½ãå½ä»¤å¦ä¸ï¼
åå»ºå·¥å ·é¾æ件夹ï¼
[root@localhost cross]# mkdir embedded-toolchains
ä¸é¢å¨æ¤æ件夹ä¸å»ºç«å¦ä¸å 个ç®å½ï¼
setup-dirï¼åæ¾ä¸è½½çå缩å ï¼
src-dirï¼åæ¾binutilsãgccãglibc解åä¹åçæºæ件ï¼
Kernelï¼åæ¾å æ ¸æ件ï¼å¯¹å æ ¸çé ç½®åç¼è¯å·¥ä½ä¹å¨æ¤å®æï¼
build-dir ï¼ç¼è¯src-dirä¸é¢çæºæ件ï¼è¿æ¯GNUæ¨èçæºæ件ç®å½ä¸ç¼è¯ç®å½å离çåæ³ï¼
tool-chainï¼äº¤åç¼è¯å·¥å ·é¾çå®è£ ä½ï¼
programï¼åæ¾ç¼åç¨åºï¼
doc:说æææ¡£åèæ¬æ件ï¼
ä¸é¢å»ºç«ç®å½ï¼å¹¶æ·è´æºæ件ã
[root@localhost cross] #cd embedded- toolchains
[root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost embedded- toolchains] #cd setup-dir
æ·è´æºæ件ï¼
è¿éæ们éç¨ç´æ¥æ·è´æºæ件çæ¹æ³ï¼é¦å åºè¯¥ä¿®æ¹setup-dirçæé
[root@localhost embedded- toolchains] #chmod setup-dir
ç¶åç´æ¥æ·è´/home/yyzç®å½ä¸çæºæ件å°setup-dirç®å½ä¸ï¼å¦ä¸å¾ï¼
建ç«ç¼è¯ç®å½ï¼
[root@localhost setup-dir] #cd ../build-dir
[root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc
ä¸ãè¾åºç¯å¢åé
è¾åºå¦ä¸çç¯å¢åéæ¹ä¾¿æ们ç¼è¯ã
为ç®åæä½è¿ç¨ãä¸é¢å°±å»ºç«shellå½ä»¤èæ¬environment-variablesï¼
[root@localhost build -dir] #cd ../doc
[root@localhost doc] #mkdir scripts
[root@localhost doc] #cd scripts
ç¨ç¼è¾å¨viç¼è¾ç¯å¢åéèæ¬envionment-variablesï¼[root@localhost scripts]
#vi envionment-variables
export PRJROOT=/home/yyz/cross/embedded-toolchains
export TARGET=arm-linux
export PREFIX=$PRJROOT/tool-chain
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
æªå¾å¦ä¸ï¼
æ§è¡å¦ä¸è¯å¥ä½¿ç¯å¢åéçæï¼
[root@localhost scripts]# source ./environment-variables
åã建ç«äºè¿å¶å·¥å ·ï¼binutilsï¼
ä¸é¢å°åæ¥ä»ç»å®è£ binutils-2..1çè¿ç¨ã
[root@localhost script] # cd $PRJROOT/src-dir
[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2..1.tar.bz2
[root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils
å建Makefileï¼
[root@localhost build-binutils] #../../src-dir/binutils-2..1/configure --target=$TARGET --prefix=$PREFIX
å¨build-binutilsç®å½ä¸é¢çæMakefileæ件ï¼ç¶åæ§è¡makeï¼make install,æ¤è¿ç¨æ¯è¾ç¼æ ¢ï¼å¤§çº¦éè¦ä¸ä¸ªåéå·¦å³ãå®æåå¯ä»¥å¨$PREFIX/binä¸é¢çå°æ们çæ°çbinutilã
è¾å ¥å¦ä¸å½ä»¤
[root@localhost build-binutils]#ls $PREFIX/bin
升级 GLIBC 后想回退,遇到 __resolv_context_ 相关符号报错
在处理GLIBC升级后回退问题时,遇到了与__resolv_context_相关符号的链接错误。本文将详细分析这一现象及其解决方案。
首先,升级GLIBC后,若用户希望回退到原有版本,却发现编译出的网站源码程序修改可执行文件和依赖的动态库在链接时遇到错误。这是由于新版GLIBC的libc.so干扰了链接过程。在Ubuntu .服务器上,GLIBC版本为2.,但用户为了运行Open3D,安装了GLIBC 2.。
当使用新版GLIBC后,GCC在链接时会寻找libc.so,而在PATH环境变量中指定了新的目录,使得GCC在链接时使用了新的libc.so文件。为解决此问题,可以临时使用export命令修改PATH,排除/usr/local/bin。
链接错误通常与libc.so的加载有关。GCC在链接可执行文件时,会查找依赖的动态库,如OpenCV的libopencv_videoio.a静态库和ffmpeg的动态库。在/etc/ld.so.conf.d/libc.so中,配置了将/usr/local/lib目录作为默认查找目录。使用ldconfig -p验证了这一配置,linux阅读大工程源码并显示了在旧版本GLIBC中找到的三个库。
错误符号__resolv_context_get与libresolv.so.2库关联,但实际上这是与符号解析有关的问题。在GLIBC代码中找到了这些符号的描述。为解决此问题,可以修改/usr/local/lib目录为/usr/local/lib-old,并验证先前链接器报告的未找到符号现在位于GLIBC 2.中。
若希望在回退GLIBC版本时保持可执行文件和动态链接阶段的libc.so不变,需要确保当前GCC使用的是预期的GLIBC版本。正确的卸载和安装GLIBC方式是关键。一种策略是在外部目录构建并安装GLIBC,避免直接修改系统的默认配置。
在处理已经安装到/usr/local的GLIBC问题时,应谨慎处理,避免影响其他文件或系统稳定。正确的做法是使用与安装配套的卸载工具,或通过目录改名等方法进行回退。本文建议在执行卸载操作时,使用外部目录构建的GLIBC版本,以避免直接在glibc源码目录下执行构建带来的风险。
总之,升级GLIBC后遇到回退问题时,关键在于理解链接过程中的依赖关系和环境变量的影响,以及采取适当的策略来管理和修改这些依赖,以确保系统稳定性和兼容性。
Linux 调试秘籍深入探索 C++运行时获取堆栈信息和源代码行数的终极指南
在软件开发的世界里,特别是在C++领域,运行时错误和异常是常见的挑战。这些错误和异常往往需要开发者深入探索、分析和解决。在这个过程中,获取运行时的堆栈信息和代码行数成为了一项至关重要的任务。正如《代码大全》(Code Complete) 中所说:“好的代码是自我解释的。” 但在现实世界中,当面临复杂的、多层次的代码结构时,我们需要更多的上下文信息来理解和解决问题。
在C++中,获取运行时的堆栈信息和代码行数并不像看上去那么简单。我们常常需要依赖外部工具和库来帮助我们完成这项任务。但是,这并不意味着我们无法在代码内部实现这一功能。通过深入探索和学习,我们可以找到合适的方法和技术来实现这一目标。
在本文中,我们将探讨如何使用backtrace, dladdr, 和 libbfd 的组合来获取运行时的堆栈信息和代码行数。我们将从底层原理出发,深入分析每个函数和库的工作原理和使用方法。我们将通过实例代码,展示如何整合这些技术来实现我们的目标。
正如《C++编程思想》(The C++ Programming Language) 中所说:“C++的设计目标是表达直观的设计。” 我们的目标也是通过直观、清晰的代码和解释,帮助读者理解这一复杂但有趣的主题。
在GCC的源码中,我们可以找到backtrace 和 dladdr 函数的具体实现。这些函数位于 libgcc 和 glibc 中,通过深入分析这些源码,我们可以更好地理解它们的工作原理和限制。
通过阅读本文,读者将能够了解如何使用backtrace 函数获取当前的堆栈地址,并使用 backtrace_symbols 函数将这些地址转换为人类可读的字符串形式。这些字符串通常包含函数名、偏移量和地址。我们还将讨论如何使用 dladdr 函数解析堆栈地址,获取函数名和所在的动态链接库信息。libbfd 库将用于获取源代码的行数信息。通过详细的代码示例、图表和解释,我们将帮助读者逐步理解和掌握这些技术。
正如《深入理解计算机系统》中所说:“堆栈跟踪是程序运行时的快照,它展示了函数调用的层次结构和执行路径。” 获取堆栈信息对于调试和优化代码至关重要。
接下来,我们将深入探讨如何使用backtrace 函数获取堆栈信息。backtrace 是一个强大的工具,它能帮助我们在程序运行时捕获当前的堆栈跟踪信息。
在获取堆栈信息后,我们将讨论如何解析这些信息,以获取更具体的信息,例如函数名和源代码行数。我们将深入分析 dladdr 函数的工作原理,以及如何使用它解析堆栈地址。此外,我们还将探讨 libbfd 库如何帮助我们从堆栈地址中获取源代码的文件名和行号。
为了提供一个完整的解决方案,我们将整合所有步骤,展示如何从获取堆栈信息到解析堆栈地址,再到获取源代码行数,形成一个完整的、自动化的解决方案。
在解决可能出现的问题方面,我们将详细探讨符号缺失、动态链接库的影响、编译器和平台差异以及复杂或模糊的堆栈信息等问题,并提供相应的解决方案。我们的目标是确保实现既准确又完整,能够在各种情况下可靠地工作。
总结而言,通过综合应用backtrace, dladdr, 和 libbfd 等技术,我们不仅解决了运行时获取堆栈信息和源代码行数的复杂问题,还为读者展示了这些技术的实际应用和深层次原理。在这个过程中,我们不仅学习了技术,更深入探讨了技术背后的原理和思维。
2024-12-22 15:44
2024-12-22 15:13
2024-12-22 14:46
2024-12-22 14:44
2024-12-22 14:40
2024-12-22 14:37