2016-01-20 4 views
2

Мне интересно, удалит ли компилятор/компоновщик глобальные переменные, которые были extern 'd в общедоступном заголовке? Например:Удаление мертвого кода extern'd global

// public.h 
struct func_ptrs { 
    void (*foo)(void); 
    void (*bar)(int); 
}; 

extern const struct func_ptrs DEFAULT_FUNCS; 

и:

// private.c 
#include "public.h" 

void def_foo(void) { ... } 
void def_bar(int a) { ... } 

const struct func_ptrs DEFAULT_FUNCS = { .foo = def_foo, .bar = def_bar }; 

Есть ли какие-либо конкретные флаги компоновщика, которые позволят этой переменной (и двух функций), чтобы быть отделенной от полученного двоичного файла?

Предположим, что GCC и MSVC являются двумя целевыми компиляторами.

+1

Посмотрите здесь: http://stackoverflow.com/questions/6687630/how-to-remove-unused-cc-symbols-with-gcc-and-ld – nsilent22

ответ

0

DEFAULT_FUNCS:

Поскольку символ DEFAULT_FUNCS - из-за его рамки и модификаторов - подлежит экспортируются в таблицу символов из двоичного файла для (динамическое) связывание, она не может быть лишен. Другими словами: компоновщик (ld) не может определить, будут ли использоваться символы или нет.

Функции def_foo & def_bar

Кроме того, нет никаких функций на всех, которые могут быть удалены, так как вы только объявили им. В самом деле, связывание этого двоичного файла потерпит неудачу, поскольку def_foo и def_bar являются неопределенными символами. более

одно: Правильно было бы:

const struct func_ptrs DEFAULT_FUNCS = ... 

без звездочки, так как вы инициализировать-структуру не указатель.

+0

Я обновил исходное сообщение, чтобы предположить, что функции были реализованы. В любом случае, поможет ли «-flto» в снятии во время связывания? – MarkP

+0

Всё зависит от меня. Если символы находятся в таблице динамических символов (опция -rdynamic), оптимизатор времени ссылки не может удалить его, поскольку он не знает, будет ли он связан во время выполнения. Со стандартными опциями он может обнаружить, что символ DEFAULT_FUNCS не ссылается и не удаляет код, а затем все символы, на которые не ссылаются после его удаления. – Ctx