Изменение основной части проекта C ++ без использования опции -nostartfiles - PullRequest
0 голосов
/ 08 декабря 2018

В данном проекте C ++ я пытаюсь заменить основной файл на свой newEntry.cpp:

void entry(){
...
}

Согласно некоторым сообщениям в Интернете, для этого вам следует использовать следующие параметры компоновщика:

-e entry newEntry.cpp -nostartfiles

-e "символ" "файл" передает новый основной файл компоновщику, а -nostartfiles пропускает файл crt *, поэтому он не предоставляет фактическую основную часть.

Проблема в том, что в crt определен скрытый символ _dso_handler, поэтому, используя этот подход, вы получите следующую ошибку:

/usr/include/c++/4.7/iostream:75: undefined reference to `__dso_handle'

-nostartfilesвызывая новую проблему здесь.Как я мог решить это?Я мог бы попытаться предоставить _dso_handle (я не знаю как), но я подозреваю новые ошибки, связанные с тем, что файл crt * опущен.В некоторых статьях я читал, что использование -nostartfiles для изменения точки входа в проект C / C ++ сегодня устарело.

Так есть ли другой способ изменить основную часть моего проекта?

Заранее благодарю за помощь

1 Ответ

0 голосов
/ 19 декабря 2018

Я только что нашел, что, безусловно, самое удобное решение: использовать ld для wrap main, demo:

#include <iostream>

extern "C" int __real_main(int argc,char* argv[]);//other name for main
extern "C" int __wrap_main(int argc,char* argv[]){//called in place of main
   std::cout << "Executing " << argv[0] << std::endl;
   int ret = __real_main(argc,argv);
   std::cout << "main returned " << ret << std::endl;
   return ret;
   }
 int main(int argc,char* argv[]){
   std::cout << "Main execution" << std::endl;
   return 42;
   }

Компилировать с опцией компоновщика --wrap=main с c++ -Wl,--wrap=main file.cpp.Вуаля!

Живая демоверсия

...