2010-07-19 21 views
21

Estoy intentando compilar un archivo ejecutable (archivo ELF) que no utiliza un cargador dinámico. Construí un compilador cruzado que compila mips de Linux para ser utilizado en un simulador que hice. Afirmé el flag -static-libgcc en la compilación de mi archivo hello.cpp (hello world programme). Aparentemente, esto no es suficiente sin embargo. Porque todavía hay un segmento en mi archivo ejecutable que contiene el nombre/ruta del cargador dinámico. ¿Qué banderas uso para generar un ejecutable que contiene TODO lo que se necesita ejecutar? ¿Debo reconstruir mi compilador cruzado?Compilar un archivo ejecutable estático independiente

Respuesta

12

Intente utilizar la bandera -static?

+0

¿Hay una buena descripción de recursos ¿Cuál es el resultado exacto de cada uno de los indicadores de gcc? No estoy 100% seguro de si realmente estoy desactivando la carga dinámica o no. Cuando uso -estático todavía tengo el nombre de un cargador dinámico colocado en mi sección .interp del archivo elf. –

+0

http://gcc.gnu.org/onlinedocs/gcc/Option-Index.html Solía ​​escribir un sistema operativo que carga los archivos ejecutables de elf y puedo confirmar que el indicador estático funciona, simplemente ignore las cosas relacionadas con el ld y saltar directamente al punto de entrada del ejecutable – Tomaka17

+0

He leído algo sobre el uso de alguna opción de configuración "-disable-shared". ¿No es necesario compilar un ejecutable independiente? –

61

Use las siguientes banderas para ligarse

-static -static-libgcc -static-libstdc++ 

Utilice estas tres banderas para enlazar con las versiones estáticas de todas las dependencias (gcc suponiendo). Tenga en cuenta que, en cierta situación, no necesariamente necesita las tres banderas, pero tampoco "duelen". Por lo tanto, solo enciende los tres.

Comprobar si efectivamente trabajadas

  1. Asegúrese de que no hay realmente ninguna vinculación dinámica

    ldd yourexecutable 
    

    debe devolver "no es un ejecutable dinámico" o algo equivalente.

  2. Asegúrese de que no hay símbolos sin resolver dejaron

    nm yourexecutable | grep " U " 
    

    La lista debe estar vacío o debe contener solamente algunos símbolos kernel-espaciales especiales como

    U __tls_get_addr 
    
  3. Por último, compruebe si en realidad puede ejecutar su ejecutable

+2

¡Esta debería ser la respuesta aceptada! –

Cuestiones relacionadas