No soy el mayor experto en bibliotecas compartidas, ¡así que podría estar equivocado aquí!
Si estoy acertando acerca de lo que está tratando de hacer, simplemente enlace su lib compartido contra libc.so. No desea una copia adicional de sscanf incrustado en su biblioteca.
He respondido a sus preguntas antes de que hubiera descubierto a qué se dirigía, en caso de que le interesen las respuestas.
¿Hay alguna manera de decirle a ld que solo resuelva ciertos símbolos al compilar la biblioteca compartida?
solo extern, no estático, las funciones y variables van en la tabla de símbolos de la biblioteca compartida.
Cuando construye su biblioteca compartida, los símbolos que no se encuentren en los objetos en la línea de comando del enlazador permanecerán sin resolver. Si el enlazador se queja de eso, es probable que deba vincular su lib compartida con libc compartida. Puede tener librerías compartidas que dependan de otras librerías compartidas, y ld.so puede ocuparse de las cadenas de dependencia.
Si tuviera más representantes, le preguntaría esto como un comentario: ¿Tiene una versión personalizada de sprintf/sscanf, o estaría bien que su biblioteca compartida use la implementación en -lc? Si -lc está bien, entonces mi respuesta probablemente resuelva tu problema. Si no es así, entonces necesita construir su biblioteca compartida de objetos que solo tienen las funciones que necesita. es decir, no lo vincule con /usr/lib/libc.a.
Tal vez estoy siendo confundidos por su
libc.a (no en realidad el "verdadero" libc) línea. /usr/lib/libc.a es realmente glibc (en Linux). Es una copia estáticamente vinculada del mismo código en libc.so. A menos que estés hablando de tu propia libc.a (que es lo que estaba pensando al principio) ...
¿Quieres convertir libc.a a una biblioteca compartida? Probablemente pueda, pero no lo haga, porque probablemente no se haya compilado como código de posición independiente, por lo que sería necesario realizar muchas reubicaciones por ld.so en tiempo de ejecución.
Extraiga sscanf de libc.a y especifique eso en la línea del enlazador?
Puede ser posible. ar t /usr/lib/libc.a para enumerar los contenidos. (los argumentos de ar son similares a tar. tar era ar para las cintas ... Old school Unix aquí.) Probablemente no sea tan fácil, porque sscanf probablemente dependa de símbolos en otros archivos .o en .a.
Disculpe la confusión de libc. Simplemente quise decir cualquier biblioteca estática de terceros y usé libc como ejemplo. Voy a modificar mi pregunta para aclarar esto. – KlaxSmashing