hakain
@hakain
Немного знаю С/С++, Qt, и микроконтроллеры

Как узнать статичная ли функция по ELF файлу?

Имеется файл foo.c, который содержит две функции одна из них static

int foo(int i, int c)
{
    return i + c;
}

static int s_foo(int i, int c)
{
    return i + c;
}


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

000000000000063a <foo>:
 63a:	55                   	push   %rbp
 63b:	48 89 e5             	mov    %rsp,%rbp
 63e:	89 7d fc             	mov    %edi,-0x4(%rbp)
 641:	89 75 f8             	mov    %esi,-0x8(%rbp)
 644:	8b 55 fc             	mov    -0x4(%rbp),%edx
 647:	8b 45 f8             	mov    -0x8(%rbp),%eax
 64a:	01 d0                	add    %edx,%eax
 64c:	5d                   	pop    %rbp
 64d:	c3                   	retq   

000000000000064e <s_foo>:
 64e:	55                   	push   %rbp
 64f:	48 89 e5             	mov    %rsp,%rbp
 652:	89 7d fc             	mov    %edi,-0x4(%rbp)
 655:	89 75 f8             	mov    %esi,-0x8(%rbp)
 658:	8b 55 fc             	mov    -0x4(%rbp),%edx
 65b:	8b 45 f8             	mov    -0x8(%rbp),%eax
 65e:	01 d0                	add    %edx,%eax
 660:	5d                   	pop    %rbp
 661:	c3                   	retq
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
hakain
@hakain Автор вопроса
Немного знаю С/С++, Qt, и микроконтроллеры
Похоже я сам нашел ответ на вопрос. Если вызвать команду objdump с опцией -t, то можно увидеть следующий вывод.
$ objdump -t test | grep foo
0000000000000000 l    df *ABS*	0000000000000000              foo.c
000000000000064e l     F .text	0000000000000014              s_foo
000000000000063a g     F .text	0000000000000014              foo

В моем случае видно, что строки имеют флаги l и g.
The symbol is a local (l), global (g), unique global (u), neither global nor local (a space) or both global and local (!). 
A symbol can be neither local or global for a variety of reasons, e.g., because it is used for debugging, 
but it is probably an indication of a bug if it is ever both local and global.

По всей видимости static функции помечаются флагом l.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы