LinkOnceODRLinkage на Windows для глобальных переменных - PullRequest
0 голосов
/ 15 ноября 2018

Я компилирую два файла с помощью clang 6.0: testA.c и testB.c.

В обоих файлах я запускаю специальный проход компилятора, который вставляет инициализированную нулем глобальную переменную с именем globalVarTest. Я установил связь такой глобальной переменной как LinkOnceODRLinkage.

Теперь, когда я связываю testA.c и testB.c вместе (то есть объектные файлы, полученные путем их компиляции отдельно), компоновщик жалуется, что существует несколько определений globalVarTest.

Разве LinkOnceODRLinkage не должен сообщать компоновщику, что, если оба определения совпадают, символы совпадают, и поэтому он может выбрать любое из двух определений при построении конечного исполняемого файла?

UPDATE: Та же процедура работает в Linux. Это ограничение компоновщика Windows? Я смог добиться того же эффекта, используя разделы COMDAT, но мне интересно, почему LLVM не использует этот механизм автоматически, и мне не требуется явно устанавливать COMDATS.

1 Ответ

0 голосов
/ 17 ноября 2018

Я получил ответ из списка рассылки LLVM.Использование LinkOnceODRLinkage не работает в Windows, хотя раньше оно работало.

Лучший способ добиться того же эффекта - явное использование разделов COMDAT.По-видимому, это происходит автоматически, устанавливая LinkOnceODRLinkage, пока поведение не изменится.

...