2009-11-13 26 views

Respuesta

15

Increíblemente poco probable ya que, normalmente, no se inyecta todo el contenido de la biblioteca en el ejecutable.

Solo obtiene lo suficiente para satisfacer todos los símbolos indefinidos. Esto realmente solo puede ser una pequeña proporción de la biblioteca. Una biblioteca generalmente consta de un conjunto de archivos de objetos, de los cuales solo los necesarios se vinculan a su ejecutable.

Por ejemplo, si lo único que llamó en la biblioteca de tiempo de ejecución de C fue exit(), es muy poco probable que tenga la familia de funciones printf() en su ejecutable.

Si enlazó directamente con los archivos del objeto, puede tener una oportunidad, ya que se incluirían tanto si se usan como si no (a menos que su enlazador sea inteligente).

Pero incluso eso sería una tarea hercúlea ya que puede que no haya información en el archivo ejecutable sobre qué secciones de código provienen de archivos de objetos específicos. Es potencialmente factible, pero, si hay otra manera, estaría mirando eso primero.

Aclaro el proceso típico:

  1. Cuatro ficheros objeto, a.o, b.o, c.o y d.o contienen las funciones a(), b(), c() y d() respectivamente. Son todos agregados al archivo abcd.a.
  2. Todos son independientes (sin dependencias) excepto por el hecho de que b() llama al .
  3. Tiene un programa principal que llama a a() y b() y lo compila y luego lo vincula con la biblioteca abcd.a.
  4. El enlazador arrastra a.ob.o y fuera de la biblioteca y en su ejecutable, que satisface la necesidad de a() y b() pero introduciendo una necesidad de c(), porque b() lo necesita.
  5. El vinculador arrastra c.o fuera de la biblioteca y dentro de su ejecutable, satisfaciendo la necesidad de c(). Ahora todos los símbolos indefinidos están satisfechos, el ejecutable está hecho y desempolvado, puede ejecutarlo cuando esté listo.

En ninguna etapa de ese proceso fue d.o arrastrado a su ejecutable por lo que no tiene ninguna esperanza de obtenerlo.

Actualización: Re el "si hay otra manera, estaría buscando en ese primer" comentario que hice anteriormente, que acaba de indica en un comentario a una de las otras respuestas que usted tiene la fuente código que hizo las bibliotecas que desea extraer. Necesito preguntar: ¿por qué no puedes reconstruir las bibliotecas con esa fuente?Eso me parece una solución mucho más fácil que tratar de recrear las bibliotecas a partir de un marasmo de código ejecutable.

+0

El escenario consiste en tener varios archivos de objetos personalizados, vincularlos en un único archivo de biblioteca personalizada, y el enlace estática que las bibliotecas archivos dentro del ejecutable. Si todas las bibliotecas son personalizadas, ¿no están "completamente integradas" en el ejecutable? En realidad, no quiero obtener el código fuente, solo quiero obtener los archivos de la biblioteca. – HyLian

+0

Si se necesita cada archivo de objeto en la biblioteca para satisfacer todos los símbolos indefinidos, entonces sí, todos estarían allí. Pero ese no es necesariamente el caso. – paxdiablo

+0

Retrocedamos. ¿Por qué no tienes los archivos .sl/.a? – paxdiablo

-1

Parece que está pidiendo un descompilador. Esas herramientas son difíciles de usar (probablemente imposibles para C++ levemente sofisticado) y si hay alguna otra forma de resolver su problema, incluyendo tomar un par de meses para volver a escribir las bibliotecas, recomendaría ese curso de acción.

Como señaló pax, incluso si usara un descompilador, solo obtendría las funciones de biblioteca que el ejecutable llamó.

+0

Pero no quiero descompilar por completo el ejecutable, no necesito el código fuente, lo que necesito son los archivos de la biblioteca que estaban vinculados en ese ejecutable y vincular otro ejecutable diferente con esas bibliotecas. – HyLian

+0

¿Tiene los archivos de encabezado para la biblioteca? –

+0

Sí, lo tengo, en realidad tengo todo el código fuente que genera esas bibliotecas. – HyLian

1

Imagine tener 10 libros en un idioma que no entiende, sin cubiertas, páginas de título, números de página y capítulos. Algunos de los libros pueden estar incompletos. Todas las páginas se mezclan juntas, por lo que es imposible averiguar dónde está el principio y el final de cada libro. (Cada página es una llamada a función) Ahora intente encontrar la página 123 del libro 5 (digamos que se menciona la función anterior Salir())

Bueno, es posible ...

+0

Y usted tiene el manuscrito original para el libro 5. Definitivamente, es más fácil simplemente reimprimir el libro 5 del manuscrito. –

Cuestiones relacionadas