newlib 的 Clang 在 libc.a 中产生未定义的符号

Clang for newlib produces undefined symbols in libc.a

我正在尝试使用 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 确实有这些符号:

cross-compiled-gcc-compiled libc.a with _vfprintf_r symbols

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

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

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 提供适当的参数。在我的例子中,我使用以下 CC_FOR_TARGET:

编辑 newlib 的 makefile
CC_FOR_TARGET="clang-5.0 -ffreestanding -m32 -save-temps"

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

是不是因为gcc提供了宏定义?但在那种情况下,这些定义也应该通过 clang 传递给新的 CC_FOR_TARGET 。试了将近一个星期,我还是一头雾水。

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