Clang для newlib создает неопределенные символы в libc.a

Я пытаюсь собрать newlib с помощью clang, в основном следуя этому сценарию: https://github.com/jpbonn/Newlib-build-scripts Я удалил все проблемы совместимости в newlib между clang и gcc, следуя этой теме: 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'

Однако, когда я компилирую newlib с помощью кросс-компилируемого gcc, он компилирует и выдает правильный файл libc.a. Я проверил с nm. Clang-compiled libc.a не имеет символа, определенного символами, в то время как cross-compiled-gcc-compiled libc.a имеет эти символы:

libc.a, скомпилированная с помощью кросс-компиляции gcc, с символами _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-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. В моем случае я редактирую make-файл для newlib со следующим CC_FOR_TARGET:

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

Я не понимаю, почему clang не может создать тот же кросс-компилированный gcc, аналогичный libc.a. Однако libc.a clang больше, чем у cross-compiled-gcc.

Это из-за определений макросов, предоставленных gcc? Но в таком случае эти определения должны были перейти и в новый CC_FOR_TARGET с clang. Я не знаю, пробуя это в течение почти недели.


person soham    schedule 28.03.2018    source источник


Ответы (1)


Я понял проблему. Проблема в CFLAG -save-temps и с параллельным make. Я запускал make -j25 или make -j30. Оказывается, make довольно хромает в распознавании зависимости от разных рецептов. Поэтому для одного и того же файла .c с разными макросами (-DSOMETHING1 и -DSOMETHING2) происходила перезапись временных файлов (.bc, .i, .s) при параллельном запуске. Поэтому один символ был опущен в процессе, а другой добавлен.

person soham    schedule 07.04.2018