本文介绍链接过程中sysroot
的作用。
sysroot为何物
做过交叉编译的同学们,一定对下面这个错误十分熟悉吧:
1 | /cross-compiling/ld: cannot find crt1.o: No such file or directory |
在我们的pc
上,这两个文件一般在/usr/lib
或者/usr/lib32
中,通过gcc -print-search-dirs
可以看到这两个路径默认就在库的搜索路径中,所以在pc
上编译程序时不存在链接器找不到crt1.o
和crti.o
的问题。
crt1.o
负责应用程序的启动,其中包含了程序的入口函数_start
以及两个未定义的符号__libc_start_main
和main
,由_start
负责调用__libc_start_main
初始化libc
,然后调用我们源代码中定义的main
函数,crti.o
负责辅助启动这些代码。
下面我们使用交叉编译工具链来查看库的搜索路径/cross-compiling/gcc -print-search-dirs
,发现crt1.o
和crti.o
的所在目录并不在库的搜索路径中,所以会出现上述的问题。
下面就需要sysroot
出场了。sysroot
被称为逻辑根目录,只在链接过程中起作用,作为交叉编译工具链搜索库文件的根路径,如配置--sysroot=dir
,则dir
作为逻辑根目录,链接器将在dir/usr/lib
中搜索库文件。
只有链接器开启了–with-sysroot选项,–sysroot=director才生效