Vinculando símbolos a endereços fixos no Linux
Como alguém ligaria (alguns) símbolos a endereços fixos específicos usando o GNU ld para que o binário ainda pudesse ser executado normalmente no Linux (x86)? Não haverá acesso a esses símbolos, mas seus endereços são importantes.
Por exemplo, eu teria a seguinte estrutura:
struct FooBar {
Register32 field_1;
Register32 field_2;
//...
};
struct FooBar foobar;
Eu gostaria de vincularfoobar
para abordar 0x76543210, mas vincule as bibliotecas padrão e o restante do aplicativo normalmente. O aplicativo fará uso do endereço do foobar, mas não fará referência à memória (possivelmente inexistente) por trás dele.
A lógica para essa solicitação é que essa mesma fonte possa ser usada em duas plataformas: na plataforma nativa,Register32
pode ser simplesmente umvolatile uint32_t
, mas no LinuxRegister32
é um objeto C ++ com o mesmo tamanho de umuint32_t
que define, por exemplooperator=
, que usará o endereço do objeto e envia uma solicitação para uma estrutura de comunicação com esse endereço (e os dados) para executar o acesso real no hardware remoto. O vinculador garantiria, assim, aRegister32
os campos da estrutura se referem aos "endereços" corretos.