2011-05-07 13 views
5

Estoy intentando crear una biblioteca compartida en Cygwin usando un compilador cruzado i686-elf. El código es muy simple:GCC genera un archivo ELF ejecutable cuando quiero una biblioteca compartida

int add(int a, int b) { 
    return a + b; 
} 

void _init() { 
    add(3, 4); 
} 

Estoy compilando con el siguiente comando:

i686-elf-gcc -fPIC -shared -nostdlib core.c -o libcore.so 

Esto debería producir un objeto compartido, ¿verdad? Pero GCC emite una advertencia acerca de no poder encontrar el símbolo _start, que es el punto de entrada para los archivos ejecutables, no para los objetos compartidos. Por otra parte, readelf dice lo siguiente:

$ readelf -a libcore.so 
ELF Header: 
    Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
    ... 
    Type:        EXEC (Executable file) 
    ... 

lo que va mal aquí?

Respuesta

2

Lo que está saliendo mal es, básicamente, que se está dirigiendo a i686-elf, y nadie construye bibliotecas compartidas para ese objetivo. -Wl,-shared le dará algo que está marcado como una biblioteca compartida, pero ¿cómo planea cargar una biblioteca compartida en un objetivo simple?

+0

Eso funcionó muy bien, gracias. Para responder a su pregunta, estoy trabajando en un gestor de arranque que carga módulos ELF reubicables. –

0

Creo que -shared en bare metal targets es un no-op (haciendo que el compilador crea que la opción no se especificó) y, por lo tanto, el compilador crea un ejecutable. De info gcc en la línea de comandos:

'-shared' 
    Produce a shared object which can then be linked with other 
    objects to form an executable. Not all systems support this 
    option. For predictable results, you must also specify the same 
    set of options that were used to generate code ('-fpic', '-fPIC', 
    or model suboptions) when you specify this option.(1) 

... y el desplazamiento hacia abajo de las notas al pie:

(1) On some systems, 'gcc -shared' needs to build supplementary stub 
    code for constructors to work. On multi-libbed systems, 'gcc -shared' 
    must select the correct support libraries to link against. Failing to 
    supply the correct flags may lead to subtle defects. Supplying them in 
    cases where they are not necessary is innocuous. 
Cuestiones relacionadas