c++ - turbo - Obtener una lista de bibliotecas estáticas usadas en un archivo ejecutable
que es una libreria en programacion (5)
A menos que un compilador determinado almacene algún tipo de metadatos dentro del binario, entonces, no. Una biblioteca estática es un código que se compila directamente en el binario.
Como ldd
enumera solo las bibliotecas dinámicas, ¿hay alguna manera de extraer la información sobre las bibliotecas estáticas utilizadas para crear el ejecutable?
No hay forma de obtener la lista de bibliotecas estáticas dentro de algún ejecutable ELF .
Porque para el vinculador, una biblioteca estática simplemente se usa como un conjunto "perezoso" de miembros. Por lo tanto, el ejecutable ELF resultante solo contendría los miembros necesarios para vincularlo. Por lo tanto, los miembros como foo2.o
de libfoo.a
se vinculan como si el archivo de objeto foo2.o
estuviera vinculado al ejecutable (siempre que se necesite algún símbolo definido en foo2
, es decir, se haga referencia a él en algún lugar).
Por supuesto, el uso de nm
, u objdump
, o readelf
, o strings
en algún ejecutable ELF puede dar algunas pistas sobre qué archivos objeto (incluidos los que provienen de bibliotecas estáticas ) están dentro de él, porque verás los símbolos definidos en (miembros de) esas bibliotecas estáticas (o cadenas literales usadas dentro de ellas).
No, los nombres de las bibliotecas se descartan durante el proceso de vinculación. Sin embargo, si su archivo ejecutable contiene información de depuración (es decir, se compiló con el indicador -g), es posible que pueda obtener información de eso.
Si tiene el código fuente y no desea revisar todo el código para esto, puede generar un archivo de mapa mientras compila para saber qué bibliotecas estáticas están vinculadas.
Por ejemplo, g++ -Xlinker -Map=a.map main.c
, compruebe el archivo de mapa para obtener información de biblioteca estática vinculada.
ldd <exe filename>
muestra bibliotecas vinculadas dinámicamente
nm <exe filename>
muestra los símbolos en el archivo.
Para ver qué símbolos provienen de las bibliotecas estáticas, se requiere ejecutar nm
contra de esas bibliotecas para obtener una lista de los símbolos (funciones, etc.) en ellos, y luego compararlos con la lista de símbolos de nm <exe filename>
.
Compara las listas con el comando comm
. Ver man comm
para más detalles.
Esto fue tomado de este foro here .