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

时间:2018-03-28 21:27:24

标签: gcc clang cross-compiling toolchain newlib

我正在尝试使用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编译的libc.a没有符号定义的符号,而交叉编译的gcc编译的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提供适当的参数。在我的例子中,我使用以下CC_FOR_TARGET编辑newlib的makefile:

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

我不明白为什么clang无法生成相同的cross-compiled-gcc类似的libc.a。 clang的libc.a比cross-compiled-gcc更大。

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

1 个答案:

答案 0 :(得分:0)

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