Estoy tratando de vincular un binario de C++, pero obtengo errores de símbolos indefinidos. Mi binario no debería necesitar esos símbolos, y me gustaría entender la cadena de dependencia que hace que el enlazador (GNU ld o GNU gold) piense que son necesarios. Hay libfoo.a que contiene cientos de archivos .o . Mi programa está llamando a la función en libfoo.a . Me gustaría obtener un gráfico de dependencia que contenga todos los archivos .o en libfoo.a que el enlazador cree que son necesarios para vincular mi programa.
Lo necesito porque sospecho que hay un error en algún lugar de libfoo.a , funciones de llamada que no son realmente necesarias. Puedo modificar el código fuente de libfoo.a (y así eliminar las llamadas innecesarias), y para eso necesito entender dónde están las llamadas innecesarias. El gráfico de dependencia podría ayudarme a encontrarlo.
Tenga en cuenta que no hay un ejecutable resultante debido a los símbolos indefinidos.
Tenga en cuenta que mi objetivo final no es construir este binario en particular, sino asegurarme de que las funciones innecesarias no se llamen en libfoo.a .
Miré man ld , pero no pude encontrar ningún indicador de línea de comando que pudiera darme una salida más detallada.
Ejemplo de error del enlazador:
libfoo++.a(foo1.o):foo1.cc:function foo1f: error: undefined reference to 'bar' ¿Cómo averiguo qué causó que foo1.o se vinculara al ejecutable? (Para mí, está bien que la bar no esté definida, porque no la necesito. Mi problema es que se necesita foo1.o , pero no debería ser así, y me gustaría eliminar la llamada que provocó que foo1.o estar vinculado.)
Me gustaría obtener un gráfico de dependencia que contenga todos los archivos .o en libfoo.a que el enlazador cree que son necesarios para vincular mi programa.
El mapa del enlazador, impreso con el indicador -M (o --print-map ) contiene exactamente esa información. Si está utilizando un controlador de compilación (p. ej., gcc ) para realizar el enlace (debe hacerlo), agregue -Wl,-M a la línea de enlace.