Проблема статического связывания библиотек с использованием SUSE Linux и C
У меня есть очень простой C-код, который я пытался скомпилировать, чтобы понять, как работают статические библиотеки, а также BFD.
Я построил код с помощью этой команды gcc, и он не смог найти libbfd, а статическая библиотека libbfd.a находится в /usr/lib64, и я также скопировал ее локально, и учитывая, что я указал -L для обоих этих каталогов, чтобы найти статический библиотека, он все еще не мог найти это:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bfd.h"
unsigned int number_of_sections(bfd *abfd)
{
return bfd_count_sections(abfd);
}
int main (int argc, char *argv[])
{
bfd *ibfd = NULL;
unsigned int numSections = 0;
if (argc < 2)
{
printf("Argc < 2\n");
exit(EXIT_FAILURE);
}
else
{
bfd_init();
printf("filename = %s\n", argv[1]);
ibfd = bfd_openr(argv[1], NULL);
numSections = number_of_sections(ibfd);
printf("num sections = %d\n", numSections);
}
return 1;
}
gcc -g -Wall -llibbfd -I. -I/usr/include -L. -L/usr/lib64 -o getsections ./getsections.c
/usr/lib64/gcc/x86_64-suse-linux/4.7/../../../../x86_64-suse-linux/bin/ld: cannot find -llibbfd
collect2: error: ld returned 1 exit status
make: *** [build] Error 1
I also made sure the path was on the LD_LIBRARY_PATH Linux environment variable:
printenv LD_LIBRARY_PATH
/usr/lib64:/usr/lib64/mpi/gcc/openmpi/lib64
I changed the gcc command slightly (-lbfd instead of -llibbfd) and here was the error:
gcc -g -Wall -lbfd -I. -I/usr/include -L. -L/usr/lib64 -o getsections ./getsections.c
/tmp/ccM9GYqT.o:
In function `main':
/home/karen/dev/cs410_spring2014/./getsections.c:253: undefined reference to `bfd_init'
/home/karen/dev/cs410_spring2014/./getsections.c:255: undefined reference to `bfd_openr'
collect2: error: ld returned 1 exit status
make: *** [build] Error 1
Я искал и искал и не мог найти ответ на этот, скорее всего, очень простой вопрос, и я заранее извиняюсь за свое невежество!
2 ответа
Ах, верно. Ваша проблема в том, что вы указали библиотеки перед getsections.c, который их использует.
Как работает компоновщик, он извлекает из библиотек только те объектные файлы, которые разрешают некоторые символы, которые ищет компоновщик, и компоновщик обрабатывает библиотеки и объектные файлы в порядке, указанном вами в командной строке. В этом случае, когда компоновщик взглянул на libbfd.a, не было никакого неразрешенного компоновщика символов, необходимого для разрешения, поэтому он пропустил все объекты. Затем компоновщик перешел к процессу getsections.c, который использовал bfd_init и bfd_openr. Увы, это был последний пункт в командной строке, и компоновщик все еще не разрешил эти символы.
Положил -lbfd
после вашего исходного файла и ссылки должны работать.
Эта командная строка неверна:
gcc -g -Wall -lbfd -I. ...
Вы должны двигаться -lbfd
до конца линии связи. Чтобы понять почему, прочитайте это.