![构建自定义 glibc 并针对它编译程序](https://linux22.com/image/55292/%E6%9E%84%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89%20glibc%20%E5%B9%B6%E9%92%88%E5%AF%B9%E5%AE%83%E7%BC%96%E8%AF%91%E7%A8%8B%E5%BA%8F.png)
我已经成功使用以下命令交叉编译 glibc
../configure arm-none-linux-gnueabi --host=arm-none-linux-gnueabi --target=arm-linux-gnueabi --prefix=`pwd` --build=i686-pc-linux-gnu` make -j4
至于程序本身,我遵循这个帖子这一切似乎都有效......直到我意识到我对 glibc 所做的任何更改都没有反映出来。
为了进行测试来验证该库是否确实被链接,我进行了以下更改:
我修改include/signal.h
并添加了extern int my_test_fn(void);
然后首先修改signal/signal.c
,然后sysdeps/posix/signal.c
继续添加函数定义,如下所示:
int my_test_fn() {
errno=13; //EACCESS
}
当我尝试编译我的程序时,它抛出了
In function `tuning_library_init': /home/guru/workspace/tuning-library/tuning_library.c:1076: undefined reference to `my_test_fn' collect2: error: ld returned 1 exit status make: *** [host] Error 1
答案1
在你走远之前:
阅读本指南ARM交叉编译了解基本原理。无论使用什么版本,所使用的步骤始终是通用指南。对于您将学到的更深入的东西,导航 CLFS Wiki 下载或阅读当前的 Stable 书籍。按照本书的内容进行操作,直到完成交叉编译工具链的构建,然后偏离本书开始构建需要交叉编译的任何内容。
你不只是交叉编译 glibc,你需要交叉编译整个工具链。工具链组件始终是:
- 工具箱,对于汇编器和链接器
- 编译器,最有可能海湾合作委员会
- AC 图书馆,最有可能glibc或者用于嵌入式平台的 ucLibc
- 调试器,最有可能广东发展银行
看:eLinux 的工具链 Wiki 条目和GNU 工具链上的 WikiPedia 条目。
每次您针对新架构时,还必须按照特定顺序构建它们。您将通过阅读上面的任一链接来了解该顺序,尽管 CLFS 书籍将提供分步命令,并提供相当好的书面解释以及这样做背后的原因。我建议您在喝一大杯咖啡或激浪之后重新开始您的过程,因为您最初几次这样做将花费您几天的时间。随着您做得越多,这个过程就会变得根深蒂固,这将需要 4 到 6 个小时。
这里的一个常见问题是,人们会不小心将他们的主机标头和工具链与交叉编译标头混淆,这可能就是您所做的。您应该包含在交叉编译链中的头文件应该存储在某个地方,以免/home/username/usr/local/include
污染您的主机。