2013-04-09 3 views
2

В демонстрационном представлении программы на C++, что относится к GLOBAL? У меня lign, который говорит:Disassembler GLOBAL ключевое слово

je 0xb74d334a <_GLOBAL__sub_I_myFile.cpp+106>

Я предполагаю, что это призыв к myFile.cpp, но я хотел бы знать значение ГЛОБАЛЬНОГО слова перед вызовом ...

Содержание myFile.cpp:

[include guards] 
#include <mutex.hpp> // Functions I use to handle mutex 
namespce myNameSpace { 
    class myClass { 
     public: 
      static void stdOutFormat(const char* format, ...); 
     private: 
      static Mutex(Synchro) // Custom functions from mutex.hpp and others ... 
    }; 
} 
[end include guards] 

Демонтажные (я стараюсь быть как можно более кратким):

[some calls] 
call 0xb74d1b80 <[email protected]> 
test %esi, %esi 
je 0xb74d33a <_GLOBAL__sub_I_myFile.cpp+106> 
mov (%esi), %eax 
[some calls] 
+0

Это может быть только метка внутри функции. Или это может быть имя статической функции. Не могу сказать больше, слишком мало информации. –

+0

Вам нужен код myFile.cpp? – Xaltar

+0

Вы можете добавить его, если он не большой. Если он большой, сократите его до минимально возможного размера, который разобрался с подобными вещами. И, конечно же, вам нужно будет показать код C++ и его разборку, а не только одну инструкцию. –

ответ

4

Такие символы используются для статических инициализаторов, генерируемых компилятором. Из GCJ mailing list:

Символов _GLOBAL__I__XXX используются для статических инициализаторов - т.е. кода, выполняемых при запуске, как правило, перед тем главный называются. Не надо повесить на фактический XXX - это просто волшебное прикосновение, чтобы создать уникальный символ. Gcj создает статические функции инициализатора, которые вызывают _Jv_RegisterClass, чтобы зарегистрировать каждый класс в глобальной таблице, так что в будущем Class.forName может их найти.

Это говорит о GCJ, но компилятор C++ ведет себя аналогичным образом. Указатели на все такие инициализаторы помещаются в раздел .ctors и вызывается кодом запуска CRT перед вызовом main().

+0

Подождите! Вы даете мне драгоценную информацию, вы сказали «до вызова main()», какой тип кода в этой ситуации? Я думал, что главное - это первое, что называется, когда мы запускаем программу ... – Xaltar

+3

'main', где начинается ваша программа, но глобальные объекты инициализируются до запуска' main'. Например, как иначе настраиваются «cout» и «cin». Не похоже, что вы назначаете их в «главную», верно? Да, это «волшебство, которое вам обычно не нужно заботиться и не может реально изменить», но это все еще происходит. –

1

Отметьте, что _GLOBAL__sub_I_myFile.cpp+106 - это всего лишь демонстрационный способ изготовления этикетки. Он указывает на 106 байтов после метки _GLOBAL__sub_I_myFile.cpp, которую я ожидаю, это функция типа «инициализировать статический объект». В этом случае это либо компилятор/компоновщик, повторно использующий какой-то код [поскольку вы его не отправили, я не могу сказать], либо это какой-то автогенерированный код, который не живет «в функции» (может быть например, выброс исключения).