Linux下用交叉编译环境搭建器编译报错缺少Libcso6【求教】

Access denied |
used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website () has banned your access based on your browser's signature (3c5eb9d3d37913cb-ua98).相关文章推荐
linux设置交叉编译器路径
交叉编译器的安装方法,通常交叉编译器的打包发布方式有关:
>> 如果以 deb 包形式发布,则需要用 dpkg 命令进行安装。示例命令:
host$ dpkg -i package.deb
>>如果以...
本次任务是要完成嵌入式Linux下对openssl程序的支持。
我的开发环境:ARM9开发板 和 嵌入式Linux操作系统。装有Linux系统(我的是ubuntu9.04)的PC机一台。串口...
最近的项目需求中依赖libcrypto和libssl库,所以需要编译安装openssl0.9.8e,花了差不多一天的时间终于成功安装和裁剪,现在总结并分享个人的方法,贴出来供大家参考和指正。
方法如下...
安装交叉编译环境
====================================
gcc是linux环境下的asm和c语言编译器,生成的是可以在x86平台上运行的可执行程序;
而在开发...
开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛。
1、准备工具安装目录
将压缩包arm-linux-gcc-4.4.3.tar.gz存放在一个目录下,这个目录...
-o后面接的是输出文件名(arm-linux-gcc -o hello hello.c)
-v可以观看编译细节(arm-linux-g...
这是自己亲身经历的一个问题:在正确配置了arm-none-linux-gnueabi-gcc环境变量之后,终端输入arm-none-linux-gnueabi-gcc --version:
# file libc.so.6
libc.so.6: ELF 32-bit LSB shared object, ARM, version 1, for GNU/Linux 2.4.3,
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)一、下载源文件
源代码文件及其版本与下载地址:
Binutils-2.19.tar.bz2
gcc-4.4.4.tar.bz2
Glibc-2.11.2.tar.bz2
Glibc-ports-2.11.tar.bz2
Gmp-4.2.tar.bz2
Mpfr-2.4.0.tar.bz2
Linux-2.6.29.tar.bz2
Patch-2.6.29.bz2&
一般一个完整的交叉编译器涉及到多个软件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。
二、建立工作目录
&&&&&编译所用主机型号&FC12.i686
&&&&&第一次编译时用的是root用户(第二次用一般用户karen,该用户可以使用sudo指令)
&&&&&所有的工作目录都在/home/Karen/cross下面建立完成,首先在/home/karen目录下建立cross目录
&[root@localhost&&karen] mkdir cross
进入工作目录:
[root@localhost&&root]#cd /home/karen/cross&& && && &&&查看当前目录:
[root@localhost&&cross&]#&pwd&/home/karen/cross&
创建工具链文件夹:
[root@localhost&&cross]#&mkdir embedded-toolchains
在建立了顶层文件夹embedded- toolchains,下面在此文件夹下建立如下几个目录:
&O&&setup-dir,存放下载的压缩包;
&O&&src-dir,存放binutils、gcc、glibc解压之后的源文件;
&O&&kernel,存放内核文件,对内核的配置和编译工作也在此完成;
&O&&build-dir&,编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法;
&O&&tool-chain,交叉编译工具链的安装位;
&O&&program,存放编写程序;
&O&&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] #lsbuild-dir doc kernel program setup-dir src-dir tool-chain[root@localhost&&embedded- toolchains] #cd setup-dir
&拷贝源文件:这里我们采用直接拷贝源文件的方法,首先应该修改setup-dir的权限
[root@localhost&&embedded- toolchains] #chmod 777 setup-dir
然后直接拷贝/home/karen目录下的源文件到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/mxl/diliuzhang/embedded- toolchainsexport&&TARGET=arm-linuxexport&&PREFIX=$PRJROOT/tool-chainexport&&TARGET_PREFIX=$PREFIX/$TARGETexport&&PATH=$PREFIX/bin:$PATH
截图如下:
%% Q:为什么用了source ./environment-variables才正常执行,去掉source就没有执行?&%%
%%&&如果用source&执行,&不需要脚本有执行权限,&权限为664也可以,执行命令如下:%%
%%&&Source environment-variables %%
TARGET变量用来定义目标板的类型,以后会根据此目标板的类型来建立工具链。参
看表6-1所示。目标板的定义与主机的类型是没有关系的,但是如果更改TARGET的值,
GNU工具链必须重新建立一次。PREFIX变量提供了指针,指向目标板工具程序将被安装的目录。TARGET_PREFIX变量指向与目标板相关的头文件和链接库将被安装的目录。PATH变量指向二进制文件(可执行文件)将被安装的目录。
如果不惯用环境变量的,可以直接用绝对或相对路径。如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样就不用老是export这些变量了。
体系结构和TAEGET变量的对应如下表6-1所示:
表6-1&体系结构和TAEGET变量的对应
TARGET变量的值
Powerpc-linux
MIPS(big endian)
mips-linux
MIPS(little endian)
mipsel-linux
mips64-linux
i386-linux
ia64-linux
m68k-linux
m88k-linux
alpha-linux
sparc-linux
sparc64-linux
四、建立二进制工具(binutils)
Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。对这些程序的简单解释如下。
&O&&addr2line&&把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。
&O&&ar&&建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
&O&&as&&主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。
&O&&c++filt&&连接器使用它来过滤&C++&和&Java&符号,防止重载函数冲突。
&O&&gprof&&显示程序调用段的各种数据。
&O&&ld&&是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。
&O&&nm&&列出目标文件中的符号。
&O&&objcopy&&把一种目标文件中的内容复制到另一种类型的目标文件中。
&O&&objdump&&显示一个或者更多目标文件的信息。使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。
&O&&ranlib&&产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。
&O&&readelf&&显示elf格式可执行文件的信息。
&O&&size&&列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。
&O&&strings&&打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符。这个程序对于了解非文本文件的内容很有帮助。
&O&&strip&&丢弃目标文件中的全部或者特定符号。
&O&&libiberty&&包含许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。
&O&&libbfd&&二进制文件描述库。
&O&&libopcode&&用来处理opcodes的库,在生成一些应用程序的时候也会用到它。
Binutils工具安装依赖于Bash、Coreutils、Diffutils、GCC、Gettext、Glibc、Grep、Make、Perl、Sed、Texinfo等工具
下面将分步介绍安装binutils-2.19.2的过程。
[root@localhost&&script] #&cd $PRJROOT/src-dir[root@localhost&&src-dir] #&tar jxvf ../setup-dir/binutils-2.19.tar.bz2[root@localhost&&src-dir] #&cd $PRJROOT/build-dir/build-binutils创建Makefile:
[root@localhost&&build-binutils] #/src-dir/binutils-2.19/configure --target=$TARGET --prefix=$PREFIX
&&&在build-binutils目录下面生成Makefile文件,然后执行make,make install。完成后可以在$PREFIX/bin下面看到我们的新的binutil。
注意:每个工具的文件名的前缀都是前面为TARGET变量设定的值。如果目标板arm-linux,那么这些工具的文件名前缀就会是arm-linux-。这样就可以根据目标板类型找到正确的工具程序。
五、建立内核头文件
在这里我们使用时2.6.29的内核版本,因为交叉工具链工具链是针对特定的处理器和操作系统的,因此在编译之前就需要对linux内核进行配制,可以通过&make config&或&make menuconfig&命令对内核进行配制,配制完成后,在linux源文件的目录下就会生成一个.config文件,这就是我们所需要的文件。
Note:&目标板的内核版本是2.6.29
[root@localhost&&embedded- toolchains] #cd kernel
[root@localhost&&kernel] #tar jxvf ../setup-dir/ linux-2.6.29.tar.bz2& && && && && &&[root@localhost&&kernel] #bunzip2 ../setup-dir/ patch-2.6.29.bz2&[root@localhost&&kernel] #cd linux-2.6.29给Linux内核打补丁:
[root@localhost&&linux-2.6.29] #patch &p1&&&&&/setup-dir/patch-2.6.29
然后就是配置内核,第一步是修改Makefile
修改&Makefile:
ARCH = arm&&&&&&&&&&&&&&&&&&&&&&&&&
CROSS_COMPILE = arm-linux- menuconfig&&
接着使用make menuconfig进入内核配置菜单
或者直接写:
# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig&,注意在配置时一定要选择处理器的类型,比如我的目标机使用的处理器是OMAP类型的,就选TI OMAP:
System Type -&
&&&&&&&&&ARM System Type -&
&&&&&&&&&(x) TI OMAP
配置完退出并保存。
配置完须执行make,参数如下:
[root@localhost linux-2.6.29]# make ARCH=arm CROSS_COMPILE=arm-linux-&(执行过程中有错误出现也没关系,主要目的是产生头文件version.h和autoconf.h)
执行完检查一下内核目录中的/kernel/linux-2.6.29/include/linux/version.h和autoconf.h文件是不是生成了,这是编译glibc要用到的。version.h&和&autoconf.h&文件的存在,说明你生成了正确的头文件。
接下来建立工具链需要的include目录,并将内核头文件复制过去。[root@localhost&&linux-2.6.29] #cd include[root@localhost&&include] #ln -s asm-arm asm
可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。(2.6.29已自动生成)[root@localhost&&include] #cd asm[root@localhost&&asm] #ln -s arch-epxa arch&&
[root@localhost&&asm] #ln -s proc-armv proc
可以查看一下,经过编译可以自动生成。如果已经生成链接,则不必重新链接。
复制头文件到交叉编译工具链的安装目录:
[root@localhost&&asm] #mkdir &p $TARGET_PREFIX/include[root@localhost&asm] #cp &r $PRJROOT/kernel/linux-2.6.29/include/linux $TARGET_PREFIX/include[root@localhost&&asm] #cp &r $PRJROOT/ kernel /linux-2.6.29/include/asm-arm $TARGET_PREFIX/include/asm
[root@localhost&&asm] #cp &r $PRJROOT/ kernel /linux-2.6.29/include/asm-generic $TARGET_PREFIX/include
root@localhost&&asm] #cp &r $PRJROOT/ kernel /linux-2.6.29/arch/arm/include/asm&&$TARGET_PREFIX/include
root@localhost&&asm] #cp &r $PRJROOT/ kernel /linux-2.6.29/arch/arm/mach-omap2/include/mach $TARGET_PREFIX/include/asm
Note: mach-xxx是根据目标板所用的cpu类型来选择的
六、建立初始编译器&(boot strap gcc)
这一步的目的主要是建立arm-linux-gcc工具,注意这个gcc没有glibc库的支持,所以只能用于编译内核、BootLoader等不需要C库支持的程序,后面创建C库也要用到这个编译器,所以创建它主要是为创建C库做准备,如果只想编译内核和BootLoader,那么安装完这个就可以到此结束。安装过程如下:
&&[root@localhost&&build-binutils] #cd $PRJROOT/setup-dir
重命名:[root@localhost&&setup-dir] #mv gcc-core-4.4.4.tar.bz2&&gcc-4.4.4.tar.bz2&[root@localhost&&setup-dir] #cd $PRJROOT/src-dir[root@localhost&&src-dir] #tar jxvf ../setup-dir/gcc-4.4.4.tar.bz2
从&GCC-4.3起,安装GCC将依赖于GMP-4.1以上版本和MPFR-2.3.2以上版本。如果将这两个软件包分别解压到GCC源码树的根目录下,并分别命名为"gmp"和"mpfr",那么GCC的编译程序将自动将两者与GCC一起编译。建议尽可能使用最新的GMP和MPFR版本。
[root@localhost src-dir]# tar jxvf ../setup-dir/mpfr-2.4.0.tar.bz2
[root@localhost src-dir]# tar jxvf ../setup-dir/gmp-4.2.tar.bz2
[root@localhost src-dir]#&mv mpfr-2.4.0 gcc-4.4.4/mpfr
[root@localhost src-dir]#&mv gmp-4.2.0 gcc-4.4.4/gmp
&因为是交叉编译器,还不需要目标板的系统头文件,所以需要使用&--without-headers这个选项。否则会有很多*.h头文件找不到的报错
&--enable-language=c用来告诉配置脚本,需要产生的编译器支持何种语言,现在只需支持C语言。虽然配置为c,c++也可以的
&--disable-threads&是因为threads需要libc的支持。
&--disable-decimal-float,需要libc的支持,而我们在初步编译的时候尚未生成libc,否则出现以下的报错:
/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:52:18: error: fenv.h: No such file or directory
/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c: In function '__dfp_test_except':
/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: 'FE_INEXACT' undeclared (first use in this function)
/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: (Each undeclared identifier is reported only once
/../gcc-4.3.1/libgcc/config/libbid/bid_decimal_globals.c:64: error: for each function it appears in.)
&--disable-shared,既然是第一次安装ARM交叉编译工具,那么本机的glibc支持的应该是本机的编译工具库,而不是ARM交叉编译工具库。forces GCC to link its internal libraries statically,没有这个选项,会有&crti.o: No such file: No such file or directory collect2: ld returned 1 exit status
注:由于没有arm的glibc,需要使用--disable-libmudflap --disable-libssp,禁止两个边界检查使用的库。
同样,由于第一次安装ARM交叉编译工具,那么支持的libc库的头文件也没有,src-dir/gcc-4.4.4/gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS中添加两个定义:-Dinhibit_libc&&&D__gthr_posix_h
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer &fPIC
TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC&-Dinhibit_libc -D_gthr_posix.h
编译:[root@localhost&&src-dir] #cd $PRJROOT/build-dir/build-gcc
[root@localhost build-gcc]# /src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-shared --disable-threads --disable-decimal-float &disable-libmudflap &disable-lipssp
&[root@localhost build-gcc]# make all-gcc
&[root@localhost build-gcc]# make install-gcc
&[root@localhost build-gcc]# make all-target-libgcc
&[root@localhost build-gcc]# make install-target-libgcc
注:很多资料中之有前面两项,这只建立了gcc,没有建立libgcc.a,这样会在glibc的编译中出现-lgcc没有找到的错误。报告:
&&/build-tools/build-glibc/libc_pic.a
i586-linux-gcc&&&-nostdlib -nostartfiles -r -o /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.map.o '-Wl,-(' /home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/dl-allobjs.os /home/wei/workspace/mywork/moblin/build-tools/build-glibc/libc_pic.a -lgcc '-Wl,-)' -Wl,-Map,/home/wei/workspace/mywork/moblin/build-tools/build-glibc/elf/librtld.mapT
/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/arm-linux/4.4.4///ram-linux/bin/ld: cannot find -lgcc
在glibc的编译中,还需要libgcc_eh.a(否则出现错误:-lgcc_eh没有找到&&bin/ld: cannot find -lgcc_eh),使用了--disable-shared的选项,将不会生成libgcc_eh.a,可以通过对libgcc.a的链接来实现。
[root@localhost build-gcc]#&&ln -vs libgcc.a `arm-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
&&Note:arm-linux-gcc与-print-libgcc-file-name之间有一个空格  
&运行报告:
&/workspace/wei/mywork/moblin/tools/bin/../lib/gcc/i586-linux/4.3.3/libgcc_eh.a& -& &libgcc.a&
装完成后,查看结果:
[root@localhost&&build-gcc] #ls $PREFIX/bin&
如果arm-linux-gcc等工具已经生成,表示boot trap gcc工具已经安装成功
七、编译glibc
&&这一步是最为繁琐的过程,目标板必须靠它来执行或者是开发大部分的应用程序。glibc套件常被称为C链接库,但是glibc实际产生很多链接库,其中之一是C链接库libc。因为嵌入式系统的限制,标准GNU C链接库显得太大,不适合应用在目标板上。所以需要寻找C链接库的替代品,在这里现以标准GNU C为例建立工具链。
[root@localhost&&build-gcc] #cd $PRJROOT/src-dir[root@localhost&&src-dir] #&tar jxvf ../setup-dir/glibc-2.11.2.tar.bz2[root@localhost&&src-dir] #&tar jxvf ../setup-dir/glibc-ports-2.11.tar.bz2
[root@localhost&&src-dir] # mv &v glibc-ports-2.11 glibc-2.11.2/ports
[root@localhost&&src-dir] # cd glibc-2.11.2
[root@localhost&&glibc-2.11.2] # patch &Np1 &i /setup-dir/glibc-2.11.2-gcc_fix-1.patch
[root@localhost&&glibc-2.11.2] # patch &Np1 &i /setup-dir/glibc-2.11.2-makefile_fix-1.patch
[root@localhost&&glibc-2.11.2] #&cd $PRJROOT/build-dir/build-glibc
[root@localhost build-glibc] # CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib //src-dir/glibc-2.11.2/configure /--host=arm-linux /--prefix=$PREFIX/$TARGET /
--with-tls --disable-profile /--enable-add-ons /
--with-headers=$PREFIX/$TARGET/include /libc_cv_forced_unwind=yes /libc_cv_c_cleanup=yes /
libc_cv_arm_tls=yes
&[root@localhost build-glibc] #&make
&[root@localhost build-glibc] # make install
&&&注:以上完成后,请查看一下$TARGET_PREFIX/lib目录下的文件libc.so,看看GROUP的内容是否指定到可以用于交叉编译的库,如果不是请修改,如下。
&&&libc.so&文件(所在目录是$TARGET_PREFIX/lib),将GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a)改为GROUP ( libc.so.6 libc_nonshared.a)
这样连接程序&ld&就会在&libc.so&所在的目录查找它需要的库,因为你的机子的/lib目录可能已经装了一个相同名字的库,一个为编译可以在你的宿主机上运行的程序的库,而不是用于交叉编译的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
&经过查看,发现libc.so中的GROUP已经是交叉编译链的目录,所以不用更改
对&libc.so&的修正&
vi $PREFIX /${TARGET}/lib/libc.so
去掉绝对路径,修改后的内容如下:
/* GNU ld script
&&&&Use the shared library, but some functions are only in
&&&&the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
八、建立全套编译器&(full gcc)
[root@localhost&&build-gcc] #/src-dir/gcc-4.4.4/configure --target=$TARGET --prefix=$PREFIX&&--enable-languages=c,c++ --enable-shared
[root@localhost&&build-gcc] #make all
[root@localhost&&build-gcc] #make install
我们再来看看&$PREFIX/bin&里面多了哪些东西。你会发现多了&arm-linux-g++&、和&arm-linux-c++&几个文件。
G++-gnu的&c++&编译器。
C++-gnu&的&c++&编译器。
至此,整个交叉编译环境就建立完成了。
&九、完成工具链的设置
&root@localhost&&build-gcc] #&cd $TARGET_PREFIX/bin
查看文件是否为二进制文件:[root@localhost&&bin] #&file as ar gcc ld nm ranlib strip& &
查看缺省的搜寻路径:[root@localhost&&bin] #arm-linux-gcc -print-search-dirs&&
&&十、测试和验证交叉编译工具
&&&&下面编写一个简单的C程序,使用建立的工具链。、[root@localhost&&bin] #cd $PRJROOT/program[root@localhost&&program] #vi hello.c#include &stdio.h&
int main(void)
&&&&&&&&&&&printf("hello linux/n");
&&&&&&&&&&&return 0;
[root@localhost&&program] #arm-linux-gcc hello.c -o hello &static&(制作静态可执行文件)
&制作的可执行文件hello可以直接在目标机上运行。
&&&&&&&&&&&& Karen
阅读(...) 评论()拒绝访问 | www. | 百度云加速
请打开cookies.
此网站 (www.) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3c5eb9daa55a43ef-ua98).
重新安装浏览器,或使用别的浏览器查看: 4873|回复: 23
【进阶类教程】想要新的软件?交叉编译简易教程与实战
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
本帖最后由 御剑江湖 于
21:31 编辑
想要新版本的软件,但entware里太旧?
想用所有支持的功能都包括了的软件,但固件带的是阉割版?
甚至想用连entware里都还没包括进来的软件?
那就自己动手丰衣足食吧~
本文主要介绍采用make作为构建系统的项目的交叉编译方法。常见的一些软件都是用make的,可以在下载到源码后尝试一下。
(这篇文章都讲的是终端里的事,所以就不截图了,全部上文字……)
零、获取程序的源码以及适用于路由的交叉编译工具链
直接谷歌搜出来解压就行。一般标明了source、src或者后缀是.tar.*的就是了。找不到官网的话就在GitHub搜索,找到以后可以先在Releases标签里寻找最新版本,没有Releases的话在项目主页用Download ZIP打包下载、git同步均可。(还找不到的话放弃吧……)
至于工具链,博通ARM的路由大多都是通用的。我自己用的工具链是EA6200的GPL Archive里面带的,可以从这里下载: 解压后里面有个hndtools*的就是。把它解压到一个你记得的地方,比如/opt/toolchain底下(检验一下:存在/opt/toolchain/arm-router/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/arm-brcm-linux-uclibcgnueabi-cc这个文件)
一、生成Makefile
make需要有一个Makefile来作为编译指令。下载到源码以后先看一下README,看Makefile是怎么生成的,才能选择正确的方式来配置交叉编译。一般Makefile的生成有以下几种方式:
1. 采用autogen.sh、bootstrap或者configure
这种项目的根目录里会有一个autogen.sh、bootstrap或者configure文件。如果存在前两者的话,它们就是用来辅助生成configure的,然后再由configure来生成Makefile。有些项目同时带有autogen/bootstrap以及configure,这种一般是预先已经生成了configure文件的,可以先拿它的configure执行下面的步骤,不行的话再执行autogen/bootstrap来重新生成configure。
比如MentoHUST(autogen):
比如LCD4Linux(bootstrap):
1.1 (可选)执行autogen/bootstrap
如果是autogen.sh的话,通常需要先通过包管理器(比如apt-get)安装这几个包:autoconf automake autopoint,报错的话再安装gettext试试。一般就可以执行成功了。
如果是bootstrap的话,可以尝试直接执行,根据返回信息来确定需要装什么依赖包。
1.2 带参数执行configure
这就是交叉编译的重点了。
首先./configure --help看看有没有什么功能要特别注意开关的。比如MentoHUST中的桌面提醒就是没有必要打开的(--disable-notify),libiconv则要设置编译出静态库(--enable-static=yes),libpcap要设置目标系统为Linux(--with-pcap=linux)。把这些选项记住。
其次让系统能够找到你的工具链(替换掉工具链中bin文件夹的位置):
export PATH=$PATH:/opt/toolchain/arm-router/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin复制代码
然后带--host参数执行configure。--host可以指定目标平台的类型,configure也会根据这个参数来确定编译器的名称。它的值应当是交叉编译工具链中每个工具名称所共用的前缀(好拗口……)比如说工具链里的程序的名字都长这个样子:
drwxr-xr-x&&2 root root& & 4096 4月& &7 11:09 .
drwxr-xr-x 10 root root& & 4096 4月& &7 11:09 ..
-rwxr-xr-x&&1 root root& &31361 4月& &7 11:09 aclocal
-rwxr-xr-x&&1 root root& &31361 4月& &7 11:09 aclocal-1.11
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-addr2line
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-ar
-rwxr-xr-x&&1 root root 月& &7 11:09 arm-brcm-linux-uclibcgnueabi-as
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-c++
lrwxrwxrwx&&1 root root& && &32 4月& &7 11:09 arm-brcm-linux-uclibcgnueabi-cc -& arm-brcm-linux-uclibcgnueabi-gcc
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-c++filt
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-cpp
-rwxr-xr-x&&1 root root& &28197 4月& &7 11:09 arm-brcm-linux-uclibcgnueabi-elfedit
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-g++
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-gcc
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-gcc-4.5.3
-rwxr-xr-x&&1 root root& &16853 4月& &7 11:09 arm-brcm-linux-uclibcgnueabi-gccbug
-rwxr-xr-x&&1 root root& &34819 4月& &7 11:09 arm-brcm-linux-uclibcgnueabi-gcov
-rwxr-xr-x&&1 root root&&月& &7 11:09 arm-brcm-linux-uclibcgnueabi-gprof
-rwxr-xr-x&&1 root root 月& &7 11:09 arm-brcm-linux-uclibcgnueabi-ld
-rwxr-xr-x&&1 root root 月& &7 11:09 arm-brcm-linux-uclibcgnueabi-ld.bfd复制代码
像gcc、g++、ld之类的编译工具都以arm-brcm-linux-uclibcgnueabi开头,则--host的值就是arm-brcm-linux-uclibcgnueabi。
把第一步里决定的参数和这个--host值合在一起执行configure,看能否成功(以编译libpcap为例):
./configure --host=arm-brcm-linux-uclibcgnueabi --with-pcap=linux复制代码
没有error的话就可以执行下一步了。有些程序会报错找不到某些库,就需要先下载编译那些库,再使用CFLAGS=-I.... LDFLAGS=-L...来指定那个库的位置。
注意!不要偷懒不设置$PATH而把--host写成/opt/toolchain/arm-router/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/arm-brcm-linux-uclibcgnueabi之类。因为configure会根据文件名来决定目标系统的类型(类似于ARCH-OS-xxx这类的格式)写成这么大一串就没法判断了,configure就会出错。
2. 采用cmake
这种项目的根目录里会有一个CMakeLists.txt
比如6relayd:
2.1 编写交叉编译配置文件
这里也需要让系统能够找到你的工具链(替换掉工具链中bin文件夹的位置):
export PATH=$PATH:/opt/toolchain/arm-router/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin复制代码
然后把以下内容保存为cross_compile.cmake,按照提示改,然后放在程序目录下(其实放哪里叫什么名字都行,只要一会儿能找到)
# the name of the target operating system
# 这两行不要动,是要求的
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
# which compilers to use for C and C++
# 编译器的名称,这次是带gcc、g++的全称。前一个是C的编译器,后一个是C++的
SET(CMAKE_C_COMPILER arm-brcm-linux-uclibcgnueabi-gcc)
SET(CMAKE_CXX_COMPILER arm-brcm-linux-uclibcgnueabi-g++)
# here is the target environment located
# 工具链根目录,注意这不像上面的$PATH一样带bin了
SET(CMAKE_FIND_ROOT_PATH /opt/toolchain/arm-router/hndtools-arm-linux-2.6.36-uclibc-4.5.3)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
# 设定只在工具链里寻找共享库和头文件,不要在里面找辅助工具(十有八九都找不到)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)复制代码
2.2 执行cmake生成Makefile
记得替换cross_compile.cmake的名字和路径(如果改了)
cmake . -DCMAKE_TOOLCHAIN_FILE=cross_compile.cmake复制代码
注意:如果出错了,或者要换成新的toolchain file,就要先删除CMakeCache.txt再重新执行这条指令。make clean并不会删除这个文件……
3. 程序本身带一个Makefile
比如ndppd:
这种自带Makefile的项目不太多见,一般直接打开它的Makefile改CC、CXX就行了。
二、执行编译
直接敲个make就行了。
(好简单)
注意:有些程序比较麻烦,在生成Makefile阶段不检查依赖库是否正常,到了这里就出错。耐心点看缺什么,然后重新生成Makefile补上就好了。
三、上传到路由
scp传上去即可。
四、编译实战
这里将在以上的每一种方式中各选取一个程序进行编译。其中太长的输出将被截断,仅保留关键部分做讲解。
以下假定我的工具链放在/project/hnd/tools/linux,即存在/projects/hnd/tools/linux/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/arm-brcm-linux-uclibcgnueabi-cc。
三个软件的编译均在同一shell下进行,故只需要一次export PATH。如果你在不同shell中编译,请务必记得检查PATH是否包括了编译器
需要执行的指令均已加粗
4.1 MentoHUST(autogen.sh和configure)
同步源码
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial&&
╰─?&&git clone
& && && && && && && &
正克隆到 'mentohust'...
remote: Counting objects: 275, done.
remote: Total 275 (delta 0), reused 0 (delta 0), pack-reused 275
接收对象中: 100% (275/275), 121.07 KiB | 181.00 KiB/s, 完成.
处理 delta 中: 100% (133/133), 完成.
检查连接... 完成。
检查README
####如果提示缺少libpcap.so.0.x而在/usr/lib/目录下已存在一个libpcap.so.0.x.y
sudo ln -s libpcap.so.0.x.y /usr/lib/libpcap.so.0.x
否则请安装libpcap。
得知还需要libpcap(其实这个项目的文档做的不是特别好……如果需要完整功能(正确显示系统消息)还需要libiconv)
下载libpcap和libiconv
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial&&
╰─?&&git clone
正克隆到 'libpcap'...
remote: Counting objects: 14411, done.
remote: Total 14411 (delta 0), reused 0 (delta 0), pack-reused 14410
接收对象中: 100% (), 11.31 MiB | 1.26 MiB/s, 完成.
处理 delta 中: 100% (), 完成.
检查连接... 完成。
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial&&
╰─?&&wget -4
-- 23:52:53--&&
正在解析主机 ftp.gnu.org (ftp.gnu.org)... 208.118.235.20
正在连接 ftp.gnu.org (ftp.gnu.org)|208.118.235.20|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:.8M) [application/x-gzip]
正在保存至: “libiconv-1.14.tar.gz”
libiconv-1.14.tar.g 100%[=====================&]& &4.75M&&1.55MB/s 用时 3.1s& &
23:52:56 (1.55 MB/s) - 已保存 “libiconv-1.14.tar.gz” [4397])
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial&&
tar xf libiconv-1.14.tar.gz
首先编译libpcap
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libpcap&&
╰─?&&export PATH=$PATH:/project/hnd/tools/linux/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libpcap&&
╰─?&&./configure --host=arm-brcm-linux-uclibcgnueabi --with-pcap=linux
checking build system type... x86_64-unknown-linux-gnu
checking host system type... arm-brcm-linux-uclibcgnueabi
checking target system type... arm-brcm-linux-uclibcgnueabi
&...省略...&
config.status: creating pcap_set_tstamp_type.3pcap
config.status: creating config.h
config.status: executing default-1 commands
注意:最后那个--with-pcap=linux是直接运行./configure --host=arm-brcm-linux-uclibcgnueabi后报错才知道要加的。谷歌一下就好。
编译
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libpcap&&
╰─?&&make
arm-brcm-linux-uclibcgnueabi-gcc -fvisibility=hidden -fpic -I.&&-DBUILDING_PCAP -DHAVE_CONFIG_H&&-D_U_=&__attribute__((unused))& -g -O2& & -c ./pcap-linux.c
arm-brcm-linux-uclibcgnueabi-gcc -fvisibility=hidden -fpic -I.&&-DBUILDING_PCAP -DHAVE_CONFIG_H&&-D_U_=&__attribute__((unused))& -g -O2& & -c ./pcap-usb-linux.c
&...省略...&
config.status: creating pcap-config.tmp
mv pcap-config.tmp pcap-config
chmod a+x pcap-config
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libpcap&&
╰─?&&find . -name &*.a&
./libpcap.a
可以看到库文件就在根目录底下
再编译libiconv,因为是同一个shell,所以不需要再次export PATH
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libiconv-1.14&&
./configure --host=arm-brcm-linux-uclibcgnueabi --enable-static=yes
configure: WARNING: if you wanted to set the --build type, don't use --host.
& & If a cross compiler is detected then cross compile mode will be used
checking for a BSD-compatible install... /usr/bin/install -c
&...省略...&
configure: creating ./config.status
config.status: creating Makefile
config.status: executing libtool commands
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libiconv-1.14&&
╰─?&&make& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
builddir=&`pwd`&; cd libcharset && make all && make install-lib libdir=&$builddir/lib& includedir=&$builddir/lib&
make[1]: Entering directory '/media/hamster/Android/Tutorial/libiconv-1.14/libcharset'
cd lib && make all
&...省略...&
make[1]: Entering directory '/media/hamster/Android/Tutorial/libiconv-1.14/tests'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/media/hamster/Android/Tutorial/libiconv-1.14/tests'
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/libiconv-1.14&&
find . -name &*.a&
./srclib/libicrt.a
./lib/.libs/libiconv.a
./lib/libcharset.a
./libcharset/lib/.libs/libcharset.a
可以看到库文件在./lib/.libs/libiconv.a
回来编译主程序了
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/mentohust&&
╰─?&&./autogen.sh& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
+ autopoint
Copying file ABOUT-NLS
Copying file config.rpath
&...省略...&
Makefile.am:& &&&for your code, to avoid questions about which license your project uses
src/Makefile.am: installing './depcomp'
+ autoconf
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/mentohust&&
╰─?&&LIBS=/media/hamster/Android/Tutorial/libiconv-1.14/lib/.libs/libiconv.a ./configure --host=arm-brcm-linux-uclibcgnueabi --with-pcap=/media/hamster/Android/Tutorial/libpcap/libpcap.a --disable-notify
checking build system type... x86_64-unknown-linux-gnu
checking host system type... arm-brcm-linux-uclibcgnueabi
checking for a BSD-compatible install... /usr/bin/install -c
&...省略...&
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
注意:--with-pcap也是经过报错才知道要加的。而LIBS是因为这个configure没有提供指定libiconv位置的参数,故手动加上。
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/mentohust&&
╰─?&&make & && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
(CDPATH=&${ZSH_VERSION+.}:& && cd . && /bin/sh /media/hamster/Android/Tutorial/mentohust/missing autoheader)
rm -f stamp-h1
touch config.h.in
&...省略...&
make[2]: Entering directory '/media/hamster/Android/Tutorial/mentohust'
make[2]: Leaving directory '/media/hamster/Android/Tutorial/mentohust'
make[1]: Leaving directory '/media/hamster/Android/Tutorial/mentohust'
找一下可以发现生成的文件在src/mentohust。经过strip以后大小会小很多,可以放在路由器上用了(其实不strip也一样,反正128M Flash用不完)
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/mentohust&&
╰─?&&ls -la src/mentohust & && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
-rwxr-xr-x 1 hamster hamster 月&&23 00:10 src/mentohust
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/mentohust&&
╰─?&&arm-brcm-linux-uclibcgnueabi-strip src/mentohust& && && && && && && && && && && && && && && && && && && && &&&
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/mentohust&&
╰─?&&ls -la src/mentohust & && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
-rwxr-xr-x 1 hamster hamster 月&&23 00:14 src/mentohust
4.2 6relayd(cmake)
同步源码
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial&&
╰─?&&git clone & && && && && && && && && && && && && && && && && && && && && &&&
正克隆到 '6relayd'...
remote: Counting objects: 494, done.
remote: Total 494 (delta 0), reused 0 (delta 0), pack-reused 494
接收对象中: 100% (494/494), 186.67 KiB | 223.00 KiB/s, 完成.
处理 delta 中: 100% (318/318), 完成.
检查连接... 完成。
编写交叉编译配置(我这里用cat展示最终的文件)
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/6relayd&&
╰─? cat cross_compile.cmake& && && && && && && && && && && && && && && && && && && && && && && && && && && && &
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
# which compilers to use for C and C++
SET(CMAKE_C_COMPILER arm-brcm-linux-uclibcgnueabi-gcc)
#SET(CMAKE_C_COMPILER mipsel-openwrt-linux-gcc)
SET(CMAKE_CXX_COMPILER arm-brcm-linux-uclibcgnueabi-g++)
#SET(CMAKE_CXX_COMPILER mipsel-openwrt-linux-g++)
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /media/hamster/Android/EA6200/hndtools-arm-linux-2.6.36-uclibc-4.5.3)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
复制代码
生成Makefile
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/6relayd&&
╰─?&&cmake . -DCMAKE_TOOLCHAIN_FILE=cross_compile.cmake& && && && && && && && && && && && && && && && && && && && &
-- The C compiler identification is GNU 4.5.3
-- Check for working C compiler: /project/hnd/tools/linux/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/arm-brcm-linux-uclibcgnueabi-gcc
-- Check for working C compiler: /project/hnd/tools/linux/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin/arm-brcm-linux-uclibcgnueabi-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /media/hamster/Android/Tutorial/6relayd
编译
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/6relayd&&
╰─?&&make & && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
Scanning dependencies of target 6relayd
[ 16%] Building C object CMakeFiles/6relayd.dir/src/6relayd.c.o
[ 33%] Building C object CMakeFiles/6relayd.dir/src/router.c.o
[ 50%] Building C object CMakeFiles/6relayd.dir/src/dhcpv6.c.o
[ 66%] Building C object CMakeFiles/6relayd.dir/src/ndp.c.o
[ 83%] Building C object CMakeFiles/6relayd.dir/src/md5.c.o
[100%] Building C object CMakeFiles/6relayd.dir/src/dhcpv6-ia.c.o
Linking C executable 6relayd
[100%] Built target 6relayd
编译的程序就在根目录下,也可以strip来减小大小
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/6relayd&&
╰─?&&ls -la 6relayd& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
-rwxr-xr-x 1 hamster hamster 月&&23 00:16 6relayd
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/6relayd&&
╰─?&&arm-brcm-linux-uclibcgnueabi-strip 6relayd & && && && && && && && && && && && && && && && && && && && && && &
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/6relayd&&
╰─?&&ls -la 6relayd& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
-rwxr-xr-x 1 hamster hamster 63352 4月&&23 00:17 6relayd
注意:也可以选择新建一个build目录来存放编译输出,这样不会污染源码
4.3 ndppd(单纯的Makefile)
下载源码
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial&&
╰─?&&git clone & && && && && && && && && && && && && && && && && && &&&
正克隆到 'ndppd'...
remote: Counting objects: 608, done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 608 (delta 62), reused 0 (delta 0), pack-reused 512
接收对象中: 100% (608/608), 166.55 KiB | 74.00 KiB/s, 完成.
处理 delta 中: 100% (429/429), 完成.
检查连接... 完成。
修改Makefile,这里展示修改后的区别
diff --git a/Makefile b/Makefile
index 1a4e518..be
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ CXXFLAGS ?= -O3
PREFIX&&?= /usr/local
-CXX& &&&?= g++
+CXX& &&&:= arm-brcm-linux-uclibcgnueabi-g++
GZIP& & ?= /bin/gzip
MANDIR&&?= ${DESTDIR}${PREFIX}/share/man
SBINDIR ?= ${DESTDIR}${PREFIX}/sbin
除了编译器名字要改以外,?=也要改成:=。前者的意思是“没定义的话就定义成arm-....”,后者是“强行定义成arm-...”。因为系统本来有CXX,所以要强制覆盖。
编译
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/ndppd&&
╰─?&&make& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
arm-brcm-linux-uclibcgnueabi-g++ -c&&-O3 -o src/logger.o src/logger.cc
arm-brcm-linux-uclibcgnueabi-g++ -c&&-O3 -o src/ndppd.o src/ndppd.cc
arm-brcm-linux-uclibcgnueabi-g++ -c&&-O3 -o src/iface.o src/iface.cc
&...省略...&
arm-brcm-linux-uclibcgnueabi-g++ -o ndppd& &src/logger.o src/ndppd.o src/iface.o src/proxy.o src/address.o src/rule.o src/session.o src/conf.o src/route.o
/bin/gzip & ndppd.1 & ndppd.1.gz
/bin/gzip & ndppd.conf.5 & ndppd.conf.5.gz
最终程序也是在根目录下
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/ndppd&&
╰─?&&ls -la ndppd & && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &
-rwxr-xr-x 1 hamster hamster 月&&23 00:23 ndppd
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/ndppd&&
╰─?&&arm-brcm-linux-uclibcgnueabi-strip ndppd& && && && && && && && && && && && && && && && && && && && && && && &
╭─hamster@Hamster-PC /media/hamster/Android/Tutorial/ndppd&&
╰─?&&ls -la ndppd& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&
-rwxr-xr-x 1 hamster hamster 月&&23 00:23 ndppd
希望能对大家有所帮助~
<p id="rate_29" onmouseover="showTip(this)" tip="很给力!&魔力币 + 10
" class="mtn mbn">
<p id="rate_03" onmouseover="showTip(this)" tip="&魔力币 + 50
" class="mtn mbn">
<p id="rate_6" onmouseover="showTip(this)" tip="感谢支持&魔力币 + 100
" class="mtn mbn">
主题帖子积分
初级魔法师, 积分 58, 距离下一级还需 142 积分
码一下,回头仔细研读,感谢u大
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
补一个Go语言交叉编译的,是给TT加ngrok的时候用到的:
export GOARCH=arm
export GOOS=linux
make复制代码
相比C/C++类的交叉编译容易多了……
(主贴还需要审核的样子,所以先放在回复里)
主题帖子积分
魔力币4028
好有技术含量的帖子,哈哈!
主题帖子积分
初级魔法师, 积分 51, 距离下一级还需 149 积分
能不能加一个怎么添加新机型支持?如使梅林支持ea6700?
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
wangmice 发表于
能不能加一个怎么添加新机型支持?如使梅林支持ea6700?
这篇教程只是交叉编译一个软件,而新机型就不只是一个软件了,更还涉及到硬件……
主题帖子积分
初级魔法师, 积分 64, 距离下一级还需 136 积分
交叉编译工具无法下载啊,还有哪里可以下载吗?
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
交叉编译工具无法下载啊,还有哪里可以下载吗?
主题帖子积分
初级魔法师, 积分 64, 距离下一级还需 136 积分
参考这里 /forum.php?mod=redirect&goto=findpost&ptid=44681&pid=389864
好的,非常感谢,已经下载成功。
主题帖子积分
魔力币1110
交叉编译工具无法下载啊,还有哪里可以下载吗?
可以使用merlin或者Tomato的工具链都可以编译!也可以直接使用entwrae-ng来写个makefile编译更好!
哇哇哇哇哇!
主题帖子积分
中级魔法师, 积分 355, 距离下一级还需 145 积分
努力学习中啊。。
主题帖子积分
初级魔法师, 积分 125, 距离下一级还需 75 积分
请教一下,是什么环境下使用的
主题帖子积分
初级魔法师, 积分 100, 距离下一级还需 100 积分
学习了,这么精彩的教程居然没多少人看,果然是伸手党多
主题帖子积分
初级魔法师, 积分 132, 距离下一级还需 68 积分
来学习的,虽然有些还是看不懂。
主题帖子积分
魔法学徒, 积分 10, 距离下一级还需 40 积分
问问楼主,我想编译一个给K3用的radvd,然而编译过程中提示device-common.o: In function `get_iface_addrs':
/home/lijun/桌面/radvd/device-common.c:108: undefined reference to `getifaddrs'
/home/lijun/桌面/radvd/device-common.c:141: undefined reference to `freeifaddrs'
send.o: In function `add_auto_prefixes':
/home/lijun/桌面/radvd/send.c:285: undefined reference to `getifaddrs'
/home/lijun/桌面/radvd/send.c:321: undefined reference to `freeifaddrs'
collect2: ld returned 1 exit status
Makefile:880: recipe for target 'radvd' failed
make[1]: *** [radvd] Error 1复制代码
百度查了下说是uclibc不支持getifaddrs,请问楼主是如何编译radvd的呢?
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
lijun0326 发表于
问问楼主,我想编译一个给K3用的radvd,然而编译过程中提示
百度查了下说是uclibc不支持getifaddrs,请问楼 ...
可以自己找个getifaddrs的实现放进去 // 不是uClibc不支持,而是固件编译时没选
主题帖子积分
魔法学徒, 积分 10, 距离下一级还需 40 积分
可以自己找个getifaddrs的实现放进去 // 不是uClibc不支持,而是固件编译时没选 ...
lz可以分享一下你的实现嘛,用github上面找到的一个ifaddrs.c也是编译不了
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
lz可以分享一下你的实现嘛,用github上面找到的一个ifaddrs.c也是编译不了
可以尝试uClibc自带的那个ifaddrs.c
主题帖子积分
魔法学徒, 积分 10, 距离下一级还需 40 积分
本帖最后由 lijun0326 于
11:43 编辑
可以尝试uClibc自带的那个ifaddrs.c
刚才试着编译了一下6relayd,很顺利,但是编译出来的东西丢进路由器执行就这样root@LEDE_R6:~# 6relayd
-ash: 6relayd: Permission denied
root@LEDE_R6:~# chmod 755 /usr/bin/6relayd
root@LEDE_R6:~# 6relayd
-ash: 6relayd: not found复制代码
按百度的说法用ldd看了下,好像编译过程出问题了?
&div class=&blockcode&&&blockquote&root@LEDE_R6:~# ldd /usr/bin/6relayd
& && &&&/lib/ld-uClibc.so.0 (0x7f5ed000)
& && &&&libresolv.so.0 =& /usr/lib/libresolv.so.0 (0xb6fd1000)
& && &&&libc.so.0 =& /lib/ld-uClibc.so.0 (0x7f5ed000)
Error relocating /usr/bin/6relayd: __cmsg_nxthdr: symbol not found
Error relocating /usr/bin/6relayd: __res_init: symbol not found
Error relocating /usr/bin/6relayd: __uClibc_main: symbol not found复制代码
主题帖子积分
大魔导师, 积分 11382, 距离下一级还需 8618 积分
魔力币2498
刚才试着编译了一下6relayd,很顺利,但是编译出来的东西丢进路由器执行就这样
按百度的说法用ldd看了下, ...
尝试用静态链接?
DDOS纪念勋章
DDOS纪念勋章
Powered by

我要回帖

更多关于 交叉编译 的文章

 

随机推荐