LINUX.ORG.RU

ошибка при создании shared объекта в x86_64.

 ,


0

1

В i686 компилируется нормально с такой опцией.

gcc -shared -Wl,-soname,libtranslate.so.0 -o libtranslate.so.0.1 main.o
в x86_64 ошибка
ld: main.o: перемещение R_X86_64_PC32 для неопределённого символ «calloc@@GLIBC_2.2.5» не может использоваться при создании общего объекта(ов)
ld: final link failed: Некорректное значение

Как понять перемещение R_X86_64_PC32 для неопределённого символ? И можно ли ошибку исправить? Что вообще не так?

Что ты пытаешься собрать? Свою либу или чью-то? Если свою - научи меня, как ты умудряешься генерировать такие неведомые ошибки...

I-Love-Microsoft ★★★★★
()

Что вообще не так?

Очевидно, твой быдлокод. Небось ассемблера навернул, вот и не собирается

XMs ★★★★★
()

Приведи ошибку на человеческим языке пожалуйста, эти крякозябры слишком сложны для понимания.

anonymous
()
Ответ на: комментарий от anonymous

Т.е. ты понимаешь? Переведи тогда на английский ты.

anonymous
()

Вот вывод objdump -Sr main.o

0000000000000000 <intoc>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 83 ec 30             sub    $0x30,%rsp
   8:   89 7d dc                mov    %edi,-0x24(%rbp)
...
  83:   83 c0 02                add    $0x2,%eax
  86:   48 98                   cltq
  88:   be 01 00 00 00          mov    $0x1,%esi
  8d:   48 89 c7                mov    %rax,%rdi
  90:   e8 00 00 00 00          callq  95 <intoc+0x95>
                        91: R_X86_64_PC32       calloc-0x4
  95:   48 89 45 e8             mov    %rax,-0x18(%rbp)
  99:   c7 45 f0 00 00 00 00    movl   $0x0,-0x10(%rbp)
  a0:   83 7d f4 01             cmpl   $0x1,-0xc(%rbp)
  a4:   75 0b                   jne    b1 <intoc+0xb1>
  a6:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  aa:   c6 00 2d                movb   $0x2d,(%rax)
Тут явно видно что это в функции intoc И что-то в этом коде
    45          c = c / 10;
    46          char *aa = calloc(b+2,sizeof(char));
    47          int inc = 0;
Но раз R_X86_64_PC32 В calloc-0x4, то по всей видимости всё дело в строке 46 исходного кода или после неё.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Свою библиотеку собрать для x86_64 хочу. *.a собирается, а *.so нет. У меня на github'e разработка библиотеки идёт. Видимо это баг в компиляторе.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от utf8nowhere

Компилятор это не требовал. Да и всё равно не собирается с этой опцией shared библиотека.

u0atgKIRznY5
() автор топика

Для начала полезно вставить в ~/.bashrc

export LC_COLLATE=C
export LC_MESSAGES=C

Чтобы не видеть сообщения об ошибках на русском (и чтобы сортировка была как надо, а то я помню времена, когда из-за русской сортировки патчи накладывались не в том порядке, в результате они не накладывались и дебиановский пакет не собирался). После этого полезно повторно выполнить команду сборки и скопипастить сообщение об ошибке в гугл.

chimera19
()
Ответ на: комментарий от chimera19

Всё собралось. Оказывается надо

gcc -fPIC -c main.c

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

main.o надо собирать в position-independent mode (-fpic или -fPIC опция gcc).

sf ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.