-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 как будто он никогда не передавался компоновщику?

0 ответов

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