Как можно связать (некоторые) символы с определенными фиксированными адресами, используя GNU ld, чтобы двоичный код мог все еще выполняться как обычно в Linux (x86)? Доступ к этим символам не будет, но их адреса важны.
Например, у меня будет следующая структура:
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
Я бы хотел связать foobar
с адресом 0x76543210, но обычно связывать стандартные библиотеки и остальную часть приложения. Затем приложение будет использовать адрес foobar, но не будет ссылаться на (возможно, не существующую) память за ним.
Обоснование этого запроса заключается в том, что один и тот же источник может использоваться на двух платформах: на собственной платформе Register32
может быть просто volatile uint32_t
, а в Linux Register32
- это объект C ++ с тем же размером как uint32_t
, который определяет, например, operator=
, который затем использует адрес объекта и отправляет запрос в инфраструктуру связи с этим адресом (и данными) для выполнения фактического доступа на удаленном оборудовании. Таким образом, компоновщик обеспечит, чтобы поля Register32
структуры ссылались на правильные "адреса".