根目录冲突(ld-linux.so位置)解决方法有哪些
解决方法一:不追求标准
启动方法一
把上例中/mylinux文件夹放到分区中,在分区中新建linux结构,把启动时用的文件外面做指向/mylinux中对应文件的链接,如mount等命令和/sbin/init程序等。在lfs中制作目标系统时会chroot进/mnt/lfs文件夹中,这之前为chroot做的工作和我要说的是类似的,不懂的可以看看。
启动方法二
也可以把/mylinux的内容放到分区中,然后做一个链接/mylinux/lib/ ld-linux.so.2链接到/lib/ld-linux.so.2。
上面的方法都是为保持链接器的正确位置,但这就不是标准linux了。
解决方法二:临时工具链
这种方法的思想是做一个根不是/的linux系统,再用这个系统制作标准的linux系统,这样就不会有根冲突问题了。
根不/的linux系统是怎么做的呢?其实就是上面说的/mylinux中的系统,在lfs中的/tools中的系统。
上面解决方法一中可知,根不是/的linux系统是可以启动的,用解决方法一中的启动方法一启动系统,再用这个系统制作linux就可以占用根目录/了。因为启动的系统在目录/mylinux中(LFS中为/tools)。这样制作的linux就是标准结构了。
解决方法三:sysroot
根冲突的问题还可以理解为gcc和binutils的搜索路径和编译程序的根路径的冲突问题。第一步编译好目标系统的C库(一般为glibc)后,再编译程序就要用刚编译好的目标系统的C库了。也就是在编译时要搜索刚编译好的目标系统的C库。但这样编译出的程序的中路径就不是相对于根目录/的了。
如果我们能单指定gcc和binutils的搜索路径,不改变编译设置,这样问题不用解决了吗?
这种功能可以通过sysroot设定,在编译gcc和binutils时在configure的参数中加入--with-sysroot=<制作linux的根文件夹>,可以设置搜索路径,使编译过程中用的是指定的C库,而编译出的程序确是相对于根目录/的。
这样编译出的linux中的程序的链接器ld-linux.so.X的路径就正确了。这样就可以把制作的linux直接移到分区中启动了。
这是借鉴CLFS sysroot也可以叫CLFS3.0中的方法。
这种方法的好处是只要做好交叉编译的gcc和binutils就可以了,利用源系统中的辅助工具进行编译。用sysroot一般是在交叉编译中,同平台的本地编译是交叉编译的一个子集,可以用在交叉编译中的方法也可以用在本地编译中。