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-скомпилированный libc.a не имеет символа, определенного символами, в то время как кросс-скомпилированный-gcc-скомпилированный libc.a действительно имеет эти символы:

кросс-скомпилированный-gcc-скомпилированный 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-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 по определению является кросс-компилятором. Поэтому я больше не строю лязг. Я просто предоставляю соответствующий параметр для лязга. В моем случае я редактирую make-файл для newlib со следующим CC_FOR_TARGET:

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам