Я использую другой скрипт компоновщика.В некоторых это значение определено, в других оно не определено:
DIRECTORY_ADDRESS = 0x80100000;
DIRECTORY_SIZE = 32M;
При выполнении я хочу поведение по умолчанию, когда это значение не определено, и специальное поведение, когда оно определено.
Классически я получаю такие значения:
extern void * DIRECTORY_ADDRESS;
extern void * DIRECTORY_SIZE;
void f() {
void *dir_addr = &DIRECTORY_ADDRESS;
int dir_size = (int)&DIRECTORY_SIZE;
}
Мой первый пример условного выполнения кода в соответствии с существованием этого значения в скрипте компоновщика - слабый атрибут:
extern void * DIRECTORY_ADDRESS __attribute__ ((weak)) = 0x0;
extern void * DIRECTORY_SIZE __attribute__ ((weak)) = 0x0;
void f() {
if ( DIRECTORY_ADDRESS )
// special code
else
// default code
}
Но это не может работать, так как я инициализирую значение указателя, а не его адрес: даже неопределенный слабый символ имеет адрес.Так что адрес каталога всегда! = NULL.
Я почти уверен, что эта проблема уже решена, но я не могу найти ни одной связанной проблемы в Интернете.