-rdynamic
является опцией GCC .Таким образом, вы можете передать его непосредственно в GCC, когда он вызывает компоновщик (ld
).Эффект -rdynamic
заключается в том, что GCC передает --export-dynamic
при вызове ld
, как вы можете видеть в руководстве GCC: 3.14 Параметры для связывания
--export-dynamic
не является опцией GCC, но является опцией ld
.Вы можете указать GCC пропустить эту опцию, когда она вызывает ld
, передав -Wl,--export-dynamic
в GCC.
Таким образом, ваши параметры GCC:
-rdynamic -Wl,-export-dynamic
делают одно и то же дважды: -rdynamic
было бы достаточно.
Но установка:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic")
не заставит GCC передавать -rdynamic
, когда он вызывает компоновщик.
Это потому, что CMAKE_CXX_FLAGS
устанавливает параметры, которые будут переданы каждой компиляции C ++ .Поскольку при компиляции не происходит связывание, параметры связывания игнорируются и не имеют никакого эффекта.Параметры связи должны быть установлены в CMAKE_EXE_LINKER_FLAGS
, например:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
Но даже тогда ...
заголовок вашего вопросаостанется верным, потому что -rdynamic
не работает из статического двоичного файла , точка.
со страницы руководства компоновщика
- export-dynamic
При создании динамически связанного исполняемого файла использование параметра -E или параметра --export-dynamic приводит к тому, что компоновщик добавляет все символы в таблицу динамических символов..
Мой акцент.И вы не создаете динамически связанный исполняемый файл, потому что вы связываете -static
.Не будет динамической таблицы символов, в которую можно добавить все символы.
Вот элементарная демонстрация.
main.c
int foo() {
return 0;
}
int main()
{
return foo();
}
Компилировать и связывать как обычно:
$ gcc main.c
Динамическая таблица символов:
$ nm -D a.out
w __cxa_finalize
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
U __libc_start_main
Компилировать и связывать -rdynamic
;см. динамическую таблицу символов:
$ gcc -rdynamic main.c
$ nm -D a.out
0000000000201010 B __bss_start
w __cxa_finalize
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000201010 D _edata
0000000000201018 B _end
0000000000000884 T _fini
00000000000007ea T foo
w __gmon_start__
00000000000006a0 T _init
0000000000000890 R _IO_stdin_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000000880 T __libc_csu_fini
0000000000000810 T __libc_csu_init
U __libc_start_main
00000000000007f5 T main
00000000000006e0 T _start
Теперь больше символов, включая main
и foo
.
Компиляция и ссылка -static
;см. динамическую таблицу символов:
$ gcc -static main.c
$ nm -D a.out
nm: a.out: no symbols
И наконец:
$ gcc -rdynamic -static main.c
$ nm -D a.out
nm: a.out: no symbols
Вы просто не можете статически связать программу, если хотите, чтобы плагин ссылался на определяемые им символы.