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 -j25
或 make -j30
。事实证明,make
在识别对不同食谱的依赖性方面相当蹩脚。因此,对于具有不同宏(-DSOMETHING1
和 -DSOMETHING2
)的同一个 .c
文件,它会并行覆盖临时文件(.bc, .i, .s
)运行。因此,在这个过程中省略了一个符号而添加了另一个符号。
我正在尝试使用 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
:
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 -j25
或 make -j30
。事实证明,make
在识别对不同食谱的依赖性方面相当蹩脚。因此,对于具有不同宏(-DSOMETHING1
和 -DSOMETHING2
)的同一个 .c
文件,它会并行覆盖临时文件(.bc, .i, .s
)运行。因此,在这个过程中省略了一个符号而添加了另一个符号。