Функция GLOBAL__I_main - PullRequest
       43

Функция GLOBAL__I_main

3 голосов
/ 25 июня 2011

Я разобрал простую программу, написанную на C ++ и есть функция:

080486a8 <_GLOBAL__I_main>:
 80486a8:   55                      push   %ebp
 80486a9:   89 e5                   mov    %esp,%ebp
 80486ab:   83 ec 18                sub    $0x18,%esp
 80486ae:   c7 44 24 04 ff ff 00    movl   $0xffff,0x4(%esp)
 80486b5:   00 
 80486b6:   c7 04 24 01 00 00 00    movl   $0x1,(%esp)
 80486bd:   e8 a6 ff ff ff          call   8048668 <_Z41__static_initialization_and_destruction_0ii>
 80486c2:   c9                      leave  
 80486c3:   c3                      ret    
 80486c4:   90                      nop
 80486c5:   90                      nop
 80486c6:   90                      nop
 80486c7:   90                      nop
 80486c8:   90                      nop
 80486c9:   90                      nop
 80486ca:   90                      nop
 80486cb:   90                      nop
 80486cc:   90                      nop
 80486cd:   90                      nop
 80486ce:   90                      nop
 80486cf:   90                      nop 

Что это за функция? И почему после инструкции RET так много операций NOP?

Ответы [ 2 ]

5 голосов
/ 25 июня 2011

Как упоминалось в netrom, __static_initialization_and_destruction_0(int, int) организует вызов глобальных конструкторов и деструкторов.

Многие компиляторы добавляют nop инструкции после функций, чтобы включить пошаговое пересвязывание. Если вы немного измените функцию, и она будет расти, компоновщику не нужно будет перемещать все последующие функции. Вместо этого рост переписывает некоторые из бывших NOP.

1 голос
/ 25 июня 2011

Если вы разобьете __Z41__static_initialization_and_destruction_0ii, тогда вы получите __static_initialization_and_destruction_0(int, int).

Взгляните на этот ответ и, возможно, даже этот файл .

...