glibc在/lib(/lib32 /lib64)目录下的.so文件为libc.so.6
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。
不小心 unlink /lib64/libc.so.6
导致所有命令都出错
ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
执行如下命令就可以还原了,这里的so库是实际使用的库的名称
LD_PRELOAD=/lib64/libc-2.11.3.so ln -sf /lib64/libc-2.11.3.so /lib64/libc.so.6
在/usr/local 下建立名为arm-tools的文件夹
mkdir /usr/local/arm-tools
下载交叉编译器
在 https://releases.linaro.org/components/toolchain/binaries/latest-5/aarch64-linux-gnu/
可以下载 gcclinaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
上传到 /usr/local/arm-tools 目录下,交叉编译工具链的地址:gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
下载完成后,解压tar包:
tar –xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
到 /usr/local/armtools/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu/bin
执行./aarch64-linux-gnu-gcc -v
如果显示version `GLIBC_2.14' not found (required by ./aarch64-linux-gnu-gcc)
可以升级glibc的版本,不过不建议这么做
配置环境变量(可以不用配置)
修改配置文件,在配置文件的最后一行加入路径配置:
Ubuntu:vim /etc/bash.bashrc
# Add ARM toolschain path
PATH= /usr/local/arm-tools/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linuxgnu/bin:"${PATH}"
Centos: vim /etc/profile
# Add ARM toolschain path
export PATH=$PATH:/usr/local/arm-tools/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linuxgnu/bin
环境变量生效与测试
# 生效
Ubuntu: source /etc/bash.bashrc
# 测试
aarch64-linux-gnu-gcc -v
执行上面的命令,显示 arm-linux-gnueabi-gcc -v信息和版本
Centos: source /etc/profile
aarch64-linux-gnu-gcc -v
执行上面的命令,显示 arm-linux-gnueabi-gcc -v信息和版本
如下升级glibc版本到2.14做法
# wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
# tar -xvf glibc-2.14.tar.gz
# cd glibc-2.14
# mkdir build; cd build
# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
# make -j 8
# make install
查看版本,发现已升级到2.14版本
# ldd --version
# strings /lib64/libc.so.6 |grep GLIBC_
增加
CROSS_COMPILE=/usr/local/armtools/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
修改
CC = $(CROSS_COMPILE)gcc
LD=$(CROSS_COMPILE)ld
AR=$(CROSS_COMPILE)ar
RANLIB=$(CROSS_COMPILE)ranlib
要使用* .o文件在c ++ / unix中创建库
ar qc libxxx.a *.o
ranlib libxxx.a
下面是ar命令的格式:
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files...
c:创建一个库。不管库是否存在,都将创建。
q:快速追加。增加新模块到库的结尾处。并不检查是否需要替换。'a','b',或'I'任选项对此操作没有影响,模块总是追加的库的结尾处。如果使用了任选项v则列出每个模块。 这时,库的符号表没有更新,可以用'ar s'或ranlib来更新库的符号表索引。
-r 将文件插入静态库中。
s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。
将编译完成的.o文件直接加入到了库的末尾,却并没有更新库的有效符号表。连接程序进行连接时,在静态库的符号索引表中无法定 位刚才加入的.o文件中定义的函数或者变量。这就需要在完成库成员追加以后让加入的所有.o文件中定义的函数(变量)有效,完成这个工作需要使用另外一个 工具“ranlib”来对静态库的符号索引表进行更新。
合并静态库
$(AR) -M < ./newlib.mri
mri文件类似如下:
create libxxx.a
addlib lib1.a
addlib lib2.a
addlib lib3.a
addlib lib4.a
addlib lib5.a
save
end