Почему gcc не поддерживает голые функции? - PullRequest
6 голосов
/ 02 сентября 2011

Я использую голые функции для исправления частей программы во время ее работы. Я легко могу сделать это в VC ++ в Windows. Я пытаюсь сделать это в Linux, и кажется, что GCC не поддерживает голые функции. Компиляция кода с голыми функциями дает мне следующее: предупреждение: директива атрибута «голый» игнорируется. Скомпилировано под CentOS 5.5 i386.

Ответы [ 4 ]

4 голосов
/ 02 сентября 2011

Голый атрибут поддерживается только GCC на определенных платформах (ARM, AVR, MCORE, RX и SPU) в соответствии с документами :

naked: используйте этот атрибут на портах ARM, AVR, MCORE, RX и SPU, чтобы указать, что указанной функции не нужны последовательности пролога / эпилога, сгенерированные компилятором.Программист должен предоставить эти последовательности.Единственные операторы, которые можно безопасно включать в голые функции, - это операторы asm, у которых нет операндов.Следует избегать всех других операторов, включая объявления локальных переменных, операторов if и т. Д.Голые функции должны использоваться для реализации тела функции ассемблера, в то же время позволяя компилятору создать требуемое объявление функции для ассемблера.

Я не уверен, почему.

1 голос
/ 11 февраля 2018

На x86 вы можете обойти, используя вместо этого asm в глобальной области видимости:

int write(int fd, const void *buf, int count);                                            

asm                                                                              
(                                                                                
".global write                             \n\t"                                    
"write:                                    \n\t"
"       pusha                              \n\t"                                    
"       movl   $4, %eax                    \n\t"                                    
"       movl   36(%esp), %ebx              \n\t"                                    
"       movl   40(%esp), %ecx              \n\t"                                    
"       movl   44(%esp), %edx              \n\t"                                    
"       int    $0x80                       \n\t"                                    
"       popa                               \n\t"                                    
"       ret                                \n\t"                                    
);                                                                               

void _start()                                                                    
{                                                                                
#define w(x) write(1, x, sizeof(x));                                             
    w("hello\n");                                                                
    w("bye\n");                                                                  
}                                                                                

Также naked указан среди атрибутов функции x86 , поэтому я предполагаю, что он работает для более новых gcc.

1 голос
/ 24 марта 2012

Это уродливое решение.Ссылка на файл .asm для вашей целевой архитектуры.

1 голос
/ 02 сентября 2011

GCC поддерживает только голые функции на ARM и других встроенных платформах.http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

Кроме того, то, что вы делаете, по своей сути небезопасно, поскольку вы не можете гарантировать, что код, который вы исправляете, не выполняется, если программа запущена.

...