Estas cadenas están en la tabla de símbolos dinámicos , que se utiliza cuando la biblioteca se carga en tiempo de ejecución. readelf -p .dynstr mylib.so
mostrará estas entradas.
strip -g
eliminará los símbolos de depuración, pero no puede eliminar las entradas de la tabla de símbolos dinámicos, ya que pueden ser necesarios en el tiempo de ejecución. Su problema es que tiene entradas en la tabla de símbolos dinámicos para funciones que nunca serán llamadas desde fuera de su biblioteca. A menos que usted lo diga, el compilador/enlazador no tiene manera de saber qué funciones forman parte de la API externa (y por lo tanto necesitan entradas en la tabla de símbolos dinámicos) y qué funciones son privadas para su biblioteca (y por lo tanto no necesitan entradas en la tabla de símbolos dinámicos), por lo que solo crea entradas de tabla de símbolos dinámicos para todas las funciones no estáticas.
Hay dos formas principales que puede informar al compilador que funciona son privadas.
Marque las funciones privadas static
. Obviamente, esto solo funciona para funciones que solo se necesitan en una sola unidad de compilación, aunque para algunas bibliotecas esta técnica podría ser suficiente.
Utilice el atributo gcc "visibility" para marcar las funciones como visibles u ocultas. Tiene dos opciones: marcar todas las funciones privadas como ocultas o cambiar la visibilidad predeterminada a oculta utilizando la opción del compilador -fvisibility=hidden
y marcar todas las funciones públicas como visibles. Esta última es probablemente la mejor opción para usted, ya que significa que no tiene que preocuparse por agregar accidentalmente una función y olvidarse de marcarla como oculta.
Si usted tiene una función:
int foo(int a, int b);
continuación, la sintaxis para el marcado oculto es:
int foo(int a, int b) __attribute__((visibility("hidden")));
y la sintaxis para el marcado visible es:
int foo(int a, int b) __attribute__((visibility("default")));
Para más detalles, vea this document, que es una excelente fuente de información sobre este tema.
¡Gran respuesta! Necesito probar eso ... El how-to también es genial, pero es bastante largo. ¡Muchas gracias! –