构建自定义 glibc 并针对它编译程序

构建自定义 glibc 并针对它编译程序

我已经成功使用以下命令交叉编译 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,你需要交叉编译整个工具链。工具链组件始终是:

  1. 工具箱,对于汇编器和链接器
  2. 编译器,最有可能海湾合作委员会
  3. AC 图书馆,最有可能glibc或者用于嵌入式平台的 ucLibc
  4. 调试器,最有可能广东发展银行

看:eLinux 的工具链 Wiki 条目GNU 工具链上的 WikiPedia 条目

每次您针对新架构时,还必须按照特定顺序构建它们。您将通过阅读上面的任一链接来了解该顺序,尽管 CLFS 书籍将提供分步命令,并提供相当好的书面解释以及这样做背后的原因。我建议您在喝一大杯咖啡或激浪之后重新开始您的过程,因为您最初几次这样做将花费您几天的时间。随着您做得越多,这个过程就会变得根深蒂固,这将需要 4 到 6 个小时。


这里的一个常见问题是,人们会不小心将他们的主机标头和工具链与交叉编译标头混淆,这可能就是您所做的。您应该包含在交叉编译链中的头文件应该存储在某个地方,以免/home/username/usr/local/include污染您的主机。

相关内容