Опция компоновщика игнорировать неиспользуемые зависимости

Я хотел бы удалить все неиспользуемые символы из моего скомпилированного двоичного файла C++. Я видел это, который дает обзор, используя gcc, который я использую: как удалить неиспользуемые символы C/C++ с помощью GCC и ld?

Однако в моей системе опция связывания (-Wl,--gc-sections) отклонено:

$ gcc -fdata-sections -ffunction-sections a.c -o a.o -Wl,--gc-sections
ld: fatal: unrecognized option '--'
ld: fatal: use the -z help option for usage information
collect2: error: ld returned 1 exit status

Я работаю на Illumos, который является (относительно) недавним форком Solaris с GCC 4.7. Кто-нибудь знает, как правильно использовать компоновщик?


Редактировать: поиск по страницам руководства более тщательно обнаружил "-zignore":

 -z ignore | record

     Ignores, or records, dynamic dependencies that  are  not
     referenced   as  part  of  the  link-edit.  Ignores,  or
     records, unreferenced ELF sections from the  relocatable
     objects  that  are  read  as  part  of the link-edit. By
     default, -z record is in effect.

     If an ELF section is ignored, the section is  eliminated
     from  the  output  file  being  generated.  A section is
     ignored when three conditions are true.  The  eliminated
     section  must  contribute to an allocatable segment. The
     eliminated section must provide no  global  symbols.  No
     other  section  from  any object that contributes to the
     link-edit, must reference an eliminated section.

Однако следующая последовательность все еще ставит FUNCTION_SHOULD_BE_REMOVED в разделе ELF .text.FUNCTION:

$ cat a.c
int main() {
    return 0;
}
$ cat b.c
int FUNCTION_SHOULD_BE_REMOVED() {
    return 0;
}
$ gcc -fdata-sections -ffunction-sections -c a.c -Wl,-zignore
$ gcc -fdata-sections -ffunction-sections -c b.c -Wl,-zignore
$ gcc -fdata-sections -ffunction-sections a.o b.o -Wl,-zignore
$ elfdump -s a.out                     # I removed a lot of output for brevity
Symbol Table Section:  .dynsym
[2]  0x08050e72 0x0000000a  FUNC GLOB  D    1 .text.FUNCTION FUNCTION_SHOULD_BE_REMOVED
Symbol Table Section:  .symtab
[71]  0x08050e72 0x0000000a  FUNC GLOB  D    0 .text.FUNCTION FUNCTION_SHOULD_BE_REMOVED

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

1 ответ

Решение

Опция ld '-z ignore' является позиционной, она применяется к тем входным объектам, которые появляются после нее в командной строке. Пример, который вы дали:

gcc a.o b.o -Wl,-zignore

Применяет эту опцию к объектам, поэтому ничего не делается.

gcc -Wl,-zignore a.o b.o

Должно сработать

Другие вопросы по тегам