Поскольку я не смог добиться успеха с системой на базе Windows, я вернулся к Linux/Unix. На этот раз я обратился к недостаткам моей предыдущей реализации.

Первый недостаток:

Моя предыдущая реализация работала только для динамически связанного исполняемого файла. Это означало, что исполняемый файл приведет к ошибке сегментации, если пользователь попытается связать его статически.

Поэтому мне пришлось решать то же самое либо с другой реализацией (подход с нуля), либо с обновлением моей текущей реализации. Использование dlfcnбиблиотеки означало, что я больше не мог обновлять ее, поэтому я продолжил искать другое решение. Именно тогда я наткнулся на метод -Wl,-wrap для переноса функций. Этот метод работал с статически и динамически связанным исполняемым файлом. Таким образом, это была подходящая замена моей текущей реализации.

Пример -Wl,-wrap с переносом __libc_start_main для изменения точки входа приведен ниже:

Шаг 1.Создайте файл с именем wrap_libc.cpp со следующим кодом:

При использовании метода -Wl,-wrap необходимо добавить перед __wrap_ имя функции (так что __libc_start_main преобразуется в __wrap___libc_start_main).

Шаг 2.Скомпилируйте код для создания объектного файла, чтобы связать его с другим файлом. В вашем типе терминала:

$ g++ -c -o wrap_libc.o wrap_libc.cpp

Это должно создать объектный файл с именем wrap_libc.o, с которым вы позже сможете связать.

Шаг 3. Пришло время создать тестовый файл:

Шаг 4.Откройте терминал и введите:

$ g++ -static test.cpp wrap_libc.o -o static_working_file

Это должно привести к созданию статически связанного исполняемого файла. Запустите его, чтобы проверить, получили ли вы ожидаемый результат:

$ ./static_working_file
This is our Custom Entry point
main

Если ваш вывод соответствует приведенному выше выводу, все получилось. Итак, теперь мы можем заняться вторым недостатком.

Второй недостаток

Теперь, когда я заставил все работать с статически связанным исполняемым файлом, мне пришлось устранить еще один серьезный недостаток. Система HPX Runtime инициализирует ее из пользовательской реализованной точки входа. Это означает, что любая инициализация глобальной области с использованием функций HPX приведет к ошибке сегментации.

Это потребовало дальнейшего изучения, что привело к другой функции libc, известной как __libc_csu_init, которая выполняет инициализацию глобальной области видимости. Таким образом, обертывание этой функции для инициализации системы выполнения должно помочь (или привести к тому, что известно как Фиаско последовательности инициализации). Сейчас я работаю над тестированием этого метода. Простую реализацию можно увидеть здесь (требуется установленный HPX). Вам нужно будет запустить make-файл, чтобы сгенерировать исполняемый файл.

Мои текущие цели — тщательно протестировать эту реализацию, прежде чем интегрировать ее с исходным кодом (поскольку потребуется много изменений в структуре cmake). Затем я переключусь обратно на Windows, чтобы завершить проект.

До следующей недели я прощаюсь с тобой