0

我正在尝试使用 clang 构建 newlib,主要遵循以下脚本: https ://github.com/jpbonn/Newlib-build-scripts 我已经删除了 clang 和 gcc 之间 newlib 中的所有兼容性问题,遵循这个线程:https:// sourceware.org/ml/newlib/2015/msg00788.html

图书馆建得很精致。但是,我不能使用 libc.a 来编译一个简单的 Hello-World 程序simple.c。我在链接器中收到以下错误:

./bin/clang -nostdlib -fno-builtin -nostdlibinc -m32 simple.c $LIBC/lib/crt0.o -o simple -static -v -L $LIBC/lib -I $LIBC/include -lc -Wl,--verbose,-nostdlib

/lib/libc.a(lib_a-printf.o): In function `_printf_r':
newlib-1.18.0/newlib/libc/stdio/printf.c:35: undefined reference to `_vfprintf_r'
/lib/libc.a(lib_a-signal.o): In function `_init_signal_r':
/newlib-1.18.0/newlib/libc/signal/signal.c:110: undefined reference to `_malloc_r'
/lib/libc.a(lib_a-reent.o): In function `cleanup_glue':
newlib-1.18.0/newlib/libc/reent/reent.c:41: undefined reference to `_free_r'

但是,当我使用交叉编译的 gcc 编译 newlib 时,它会编译并生成正确的libc.a. 我已经检查过nm。clang-compiled libc.a 没有定义的符号,而 cross-compiled-gcc-compiled libc.a 确实具有这些符号:

带有 _vfprintf_r 符号的交叉编译 gcc 编译的 libc.a

lib/libc.a:lib_a-fprintf.o:         U _vfprintf_r
lib/libc.a:lib_a-printf.o:         U _vfprintf_r
lib/libc.a:lib_a-vfprintf.o:00000000 T _vfprintf_r
lib/libc.a:lib_a-vprintf.o:         U _vfprintf_r

带有 _vfprintf_r 符号的 clang 编译的 libc.a

lib/libc.a:lib_a-fprintf.o:         U _vfprintf_r
lib/libc.a:lib_a-printf.o:         U _vfprintf_r
lib/libc.a:lib_a-vprintf.o:         U _vfprintf_r

需要注意的是,我的 clang 没有针对我的自定义平台进行交叉编译。但是,由于 clang 根据定义是一个交叉编译器。因此,我不再构建 clang。我只是为 clang 提供适当的参数。就我而言,我使用以下内容编辑 newlib 的生成文件CC_FOR_TARGET

CC_FOR_TARGET="clang-5.0 -ffreestanding -m32 -save-temps"

我不明白为什么 clang 不能产生相同的交叉编译 gcc 的相似libc.a. clang 的 libc.a 比 cross-compiled-gcc 的大。

是因为提供给 gcc 的宏定义吗?但在那种情况下,这些定义也应该通过CC_FOR_TARGETclang 传递给新的。在尝试了将近一个星期后,我一无所知。

4

1 回答 1

0

我解决了这个问题。问题出在 CFLAG-save-temps和并行制作中。我正在跑步make -j25make -j30。事实证明,make承认对不同食谱的依赖是相当蹩脚的。.c因此,对于具有不同宏 (-DSOMETHING1和)的同一文件,它在并行运行-DSOMETHING2时会覆盖临时文件 ( )。.bc, .i, .s因此,在此过程中省略了一个符号,而添加了另一个符号。

于 2018-04-07T15:00:24.800 回答