2011-11-14 16 views
6

Al usar gcc para compilar una biblioteca compartida, es posible limitar la visibilidad de los símbolos usando -fvisibility = hidden. También me acabo de enterar de que puedes limitar la visibilidad usando la opción de script de versión en ld.versión-script y visibilidad oculta

Ahora quiero saber si es posible combinar estos. Decir que tengo un programa con el siguiente:

void foobar() {} 
void say_hello() {} 

Entonces tengo el archivo de script versión con:

{ 
    global: 
    foobar; 
} 

Y Compilo esto con: -fvisibility gcc = hidden -Wl, - versión -script = test.c -shared -o libtest.so

Cuando ejecuto nm en esto después, me parece que no se exportan símbolos. ¿Hay alguna forma de que pueda establecer la visibilidad predeterminada en oculto y usar el script de versión (u otra cosa) para exportar símbolos?

Respuesta

7

Su pregunta no tiene sentido: ¿por qué luchar -fvisibility con un guión de enlazado, cuando se puede utilizar el script enlazador a exportar exactamente lo que necesita, y ocultar todo lo demás:

{ 
    global: foobar; 
    local: *; 
}; 

Actualización:

Debido a que el código que necesita utilizar esto en usos __attribute__((visibility("default"))) ...

La secuencia de comandos del enlazador funciona bien con símbolos así marcados. Ejemplo:

// t.c 
int __attribute__((visibility("default"))) foo() { return 1; } 
int bar() { return 2; } 
int __attribute__((visibility("default"))) exported() { return 3; } 

// t.lds 
{ 
    global: exported; 
    local: *; 
}; 

gcc t.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so 
       w _Jv_RegisterClasses 
       w __cxa_finalize 
       w __gmon_start__ 
00000000000004f2 T exported 
+0

Dado que el código que necesito utilizar esto en usos __attribute __ ((visibilidad ("default"))) en el código para marcar la visibilidad a veces, pero a veces se basa en el guión enlazador. La forma en que esto se maneja en este momento es simplemente un hack gigante y estoy tratando de averiguar si hay una mejor manera de hacerlo. –

+0

Su pregunta * aún * no tiene ningún sentido. Es posible que desee tratar de explicar cuál es la mejor pregunta * real *. –

Cuestiones relacionadas