-Wl,-zundefs не только отменяет -Wl,-no-undefined, но и разрешает неопределенные символы в исполняемых файлах
Я пытаюсь создать GLib с
-fsanitize=memory
. Компиляция не выполняется при связывании разделяемых библиотек с:
undefined reference to `__msan_init'
Виновник в сочетании с
-shared
. Из
man ld
:
--no-undefined
-z defs Сообщать
о неразрешенных ссылках на символы из обычных объектных файлов. Это делается, даже если компоновщик создает несимвольную общую библиотеку. Выключатель--[no-]allow-shlib-undefined controls
поведение для сообщения о неразрешенных ссылках, обнаруженных в разделяемых библиотеках, в которых выполняется ссылка. Эффект от этой опции можно отменить с помощью "-z undefs".
Я добавил
-Wl,-zundefs
к
LDFLAGS
, но это имело побочный эффект для скрипта настройки: когда он пытается скомпилировать тестовый исполняемый файл для проверки наличия функции, он всегда успешен! Сравните вывод ссылки с различными комбинациями флагов:
[il@reallin ~]$ cat test.c
extern void badfunc();
int main(int argc, char *argv[]) {
badfunc();
return 0;
}
[il@reallin ~]$ clang -o test test.c -Wl,--no-undefined
/usr/bin/ld: /tmp/test-276ca1.o: in function `main':
test.c:(.text+0x23): undefined reference to `badfunc'
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
[il@reallin ~]$ clang -o test test.c
/usr/bin/ld: /tmp/test-c1ebab.o: in function `main':
test.c:(.text+0x23): undefined reference to `badfunc'
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
[il@reallin ~]$ clang -o test test.c -Wl,--no-undefined -Wl,-zundefs
[il@reallin ~]$
Я тоже пробовал
-Wl,--allow-shlib-undefined
вместо этого, но, похоже, это не влияет на создание самих разделяемых библиотек.
Как отменить
-Wl,--no-undefined
как будто он никогда не передавался компоновщику?