Массив необходимо экспортировать из двоичного файла, т. Е. Он должен быть символом c, опубликованным в таблице символов исполняемого файла.
На Windows, то есть:
using Function = ...;
__declspec(dllexport) const Function encrypted_functions[] = { f1, f2, ... };
На платформах, отличных от Windows, необходимо использовать золотой компоновщик и убедиться, что символ видим:
#ifdef __cplusplus
extern "C" {
#endif
__attribute__((visibility ("default")) const Functions encrypted_functions[] = ...;
#ifdef __cplusplus
}
#endif
А затем использовать опцию --export-dynamic-symbol=encrypted_functions
золотого компоновщика добавить символ в таблицу экспорта (или эквивалент в компоновщике LLVM). Имя может быть искажено, даже если это символ C, поэтому вам нужно использовать objdump
, чтобы проверить объектный файл, чтобы увидеть, каково настоящее имя символа этого массива.
Но это все немного глупо, поскольку программа шифрования должна быть частью процесса сборки и напрямую взаимодействовать с объектными файлами. Лучший способ - использовать libObject
в комплекте с проектом LLVM. См. исходные файлы , заголовки и некоторую документацию .