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
) в параллельном режиме. Поэтому один символ был пропущен в процессе, а другой добавлен.