anonymous@RULINUX.NET~# Last login: 2024-12-23 12:58:41
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

C++: как проходит инициализация программы?

Посоветуйте документ, в котором можно прочитать как выполняется иницализация программы — всё, что происходит до входа в main(). С теоретической точки зрения интересует какие вызываются функции из системных библиотек и какие выделяются ресурсы, с практической хочется попробовать изменить имя функции main(). Это может пригодится при дебаге плохо структурированной программы, когда нужно написать тестовый модуль для функций, объявленных в том же файле, что и функция main(). Например, в C можно сделать так:

extern int test_function(int x);

int main2() { exit(test_function(42)); /* с return получается сегфолт */ }

И скомпилировать так: gcc -Wl,-e,main2 test.c main.o. В C++ подобный подход приводит к сегфолту, насколько я понял из-за того, что не происходит инициализация в стандартной библиотеке. Вызов _init() в начале main2() немного помогает, но тогда получается сегфолт при обращении, например, к strlen. Как можно сделать такую штуку? Грязный хак только под g++, ELF и x86 подойдёт.

anonymous(*) (2009-06-09 18:03:15)

Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.9) Gecko/2009050519 Iceweasel/3.0.6 (Debian-3.0.6-1)

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: C++: как проходит инициализация программы? от anonymous 2009-06-09 18:03:15
avatar
Скрыть

Re:C++: как проходит инициализация программы?

может будет проще собрать программу как либу (или как экзешку с экспортируемыми функциями) и прилинковать ее к main2.c?

anonymous(*)(2009-06-24 21:35:51)

Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.13) Gecko/20080327 Firefox/2.0.0.13
[#] [Добавить метку] [Редактировать] Ответ на: C++: как проходит инициализация программы? от anonymous 2009-06-09 18:03:15
avatar
Скрыть

Re:C++: как проходит инициализация программы?

С настоящего момента данный тред посвящен Мажиде Руми.

anonymous(*)(2009-06-24 21:39:26)

Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
[#] [Добавить метку] [Редактировать] Ответ на: C++: как проходит инициализация программы? от anonymous 2009-06-09 18:03:15
avatar
Скрыть

Re:C++: как проходит инициализация программы?

Хм, действительно работает. Помнится, тогда я пробовал такой подход, но, по-видимому, неправильно указал опции сборки. Спасибо.

Решение:

  1.  [tmp]> cat main.cpp
  2.  int test_function(int x) {
  3.   return 2*x;
  4.  };
  5.  
  6.  int main() {
  7.   return test_function(42);
  8.  };
  9.  [tmp]> cat test.cpp
  10.  extern int test_function(int x);
  11.  
  12.  int main() {
  13.   return test_function(5);
  14.  };
  15.  [tmp]> g++ -fPIC -shared -Wl,-soname,libmain.so -o libmain.so main.cpp
  16.  [tmp]> g++ test.cpp -L. -lmain
  17.  [tmp]> LD_LIBRARY_PATH=. ./a.out
  18.  [tmp]> echo $?
  19.  10
  20.  

Но теоретический вопрос остаётся в силе — мне было бы интересно почитать про инициализацию программы в C++.

– топикстартер.

anonymous(*)(2009-06-29 15:09:04)

Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.9) Gecko/2009050519 Iceweasel/3.0.6 (Debian-3.0.6-1)
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!