Pregunta

¿Cómo se podría vincular (algunos) símbolos a direcciones fijas específicas usando GNU ld para que el binario aún se pudiera ejecutar normalmente en Linux (x86)? No habrá acceso a esos símbolos, pero sus direcciones son importantes.

Por ejemplo, tendría la siguiente estructura:

struct FooBar {
    Register32 field_1;
    Register32 field_2;
    //...
};

struct FooBar foobar;

Me gustaría vincular foobar a la dirección 0x76543210, pero vincula las bibliotecas estándar y el resto de la aplicación normalmente. La aplicación hará uso de la dirección de foobar, pero no hará referencia a la memoria (posiblemente inexistente) detrás de ella.

La razón de esta solicitud es que esta misma fuente se puede usar en dos plataformas: en la plataforma nativa, Register32 puede ser simplemente un volatile uint32_t, pero en Linux uint32_t es un objeto C ++ con el mismo tamaño como un operator= que define, por ejemplo <=>, que luego usará la dirección del objeto y enviará una solicitud a un marco de comunicación con esa dirección (y los datos) para realizar el acceso real en el hardware remoto. De este modo, el vinculador garantizaría que los campos <=> de la estructura se refieran a las & Quot; direcciones & Quot ;.

correctas
¿Fue útil?

Solución

La sugerencia de litb de usar --defsym symbol=address funciona, pero es un poco engorrosa cuando tiene que asignar una docena de instancias de este tipo. Sin embargo, --just-symbols=symbolfile hace el truco. Me llevó un tiempo descubrir la sintaxis de symbolfile, que es

symbolname1 = address;
symbolname2 = address;
...

Los espacios parecen ser necesarios, de lo contrario ld informa file format not recognized; treating as linker script.

Otros consejos

Pruébalo con

--defsym symbol=expression

Como con esto:

gcc -Wl,--defsym,foobar=0x76543210 file.c

Y haga que foobar en su código sea una declaración externa:

extern struct FooBar foobar;

Esto parece prometedor. Sin embargo, es una mala idea hacer algo así (a menos que realmente sepa lo que hace). ¿Por qué lo necesitas?

Te daré un consejo ... GNU LD puede hacer esto (asumiendo que las bibliotecas del sistema no necesitan la dirección que deseas). Solo necesita construir su propio script de enlazador en lugar de usar el autogenerado del compilador. Lea la página de manual de ld. Además, crear un script de enlazador para una pieza compleja de software no es una tarea fácil cuando también involucra el GLIBC.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top