LINUX.ORG.RU

Умеет ли gcc удалять неиспользуемые функции?


0

0
Неиспользуемые функции, это те, которые объявлены, но ни разу не вызывались. Крис Касперски пишет (http://www.insidepro.com/kk/029r.shtml), что такое умеет только Intelовский компилятор. Это правда?

Гугль ничего по теме не нашёл. Неужели gcc такое не умеет?

Ответ на: комментарий от Sylvia
Это не то, strip удаляет символы и секции.
LinuxUser ★★★
() автор топика
-O2 точно удаляет. -O0 нет. Попробуй сам. Тест за 10 секунд можно составить.
anonymous
()
Этим вроде линкер должен заниматься. Optlink, например, удаляет не только неиспользуемые функции, но и неиспользуемый код в используемых функциях... Вот бы он ещё elf понимал.
naryl ★★★★★
()
Ответ на: комментарий от naryl
> Optlink, например, удаляет не только неиспользуемые функции, но и неиспользуемый код в используемых функциях

это как ??

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous
Попробовал. Не удаляет.

Пробовал так:
----
neo@zion:~/root/trash> cat main.c
#include <stdlib.h>

int main()
{
        external_func1();
        return EXIT_SUCCESS;
}
neo@zion:~/root/trash> cat external.c
#include <stdio.h>

void external_func1()
{
        puts("Hello world!");
}

void external_func2()
{
        printf("Hello world!");
}
neo@zion:~/root/trash> gcc main.c external.c -O2 -o main
neo@zion:~/root/trash> objdump -S main | grep ext
Disassembly of section .text:
  400576:       e8 25 00 00 00          callq  4005a0 <external_func1>
0000000000400590 <external_func2>:
00000000004005a0 <external_func1>:
neo@zion:~/root/trash> gcc -c main.c -O2
neo@zion:~/root/trash> gcc -c external.c -O2
neo@zion:~/root/trash> gcc main.o external.o -O2 -o main
neo@zion:~/root/trash> objdump -S main | grep ext
Disassembly of section .text:
  400576:       e8 25 00 00 00          callq  4005a0 <external_func1>
0000000000400590 <external_func2>:
00000000004005a0 <external_func1>:
----
Дополнительно на всякий случай с -Os, -03, -g0 эксперементировал. И strip пробовал на всякий случай с опциями --strip-unneeded, -s. Не помогает.
LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser
попробуй сначала gcc -c на исходники, потом ar полученных объектников, а потом уже gcc archive.a -o main

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous
Помогло, компилил так:
----
neo@zion:~/root/trash> gcc main.c external.c -ffunction-sections -Wl,-gc-sections -o main
neo@zion:~/root/trash> objdump -S main | grep ext
Disassembly of section .text:
  4004d3:       e8 07 00 00 00          callq  4004df <external_func1>
00000000004004df <external_func1>:
neo@zion:~/root/trash> gcc -c main.c
neo@zion:~/root/trash> gcc -c -ffunction-sections external.c
neo@zion:~/root/trash> gcc main.o external.o -Wl,-gc-sections -o main
neo@zion:~/root/trash> objdump -S main | grep ext
Disassembly of section .text:
  4004d5:       e8 07 00 00 00          callq  4004e1 <external_func1>
00000000004004e1 <external_func1>:
neo@zion:~/root/trash>
----

Пробовал также сделать статичную библиотеку arом. Не помогло.
LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser
Хм. Как насчет __attribute__((unused))? Или этот только warning-и убирает?
spy_
()
А как насчет того, чтобы помечать, какие символы экспортировать, а какие нет? А то откуда gcc/линкер знает, будет ли кто-то внешний использовать «неиспользуемые» функции (по умолчанию все идет на экспорт).
mo3r
()
По obj'ам их разносить надо.
anonymous
()
можно было как-то, в development обсуждали.
true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.