Проблема статического связывания библиотек с использованием 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 до конца линии связи. Чтобы понять почему, прочитайте это.

Другие вопросы по тегам