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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.