X86架构下交叉编译arm64源代码

libc.so.6


glibc在/lib(/lib32 /lib64)目录下的.so文件为libc.so.6
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。

libc.so.6: cannot open shared object file: No such file or directory

不小心  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
 

安装标准的C开发环境


在/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信息和版本 

version `GLIBC_2.14' not found

如下升级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_

makefile修改

增加

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

你可能感兴趣的:(linux,linux,arm开发,ubuntu)