Мне нужно связать программу C на общем объекте без заголовков разделов - PullRequest
1 голос
/ 24 января 2010

Я написал интерфейс для генератора кода, который позволяет мне создавать общие объекты. Хотя я не хочу реализовывать поддержку таблицы заголовков разделов, потому что именно здесь сохраняется основная сложность формата файлов ELF.

GNU ld использует заголовки разделов для связи с общими объектами. Это означает, что когда я пытаюсь поместить ссылку gcc на мой общий объект без заголовков разделов, он потерпит неудачу, потому что ld не находит символы, даже если они существуют в библиотеке.

Существует ли какая-нибудь хитрость, которую я мог бы использовать, чтобы обмануть компилятор, чтобы сделать соединение успешным, даже если он не найдет определенные символы?

Вот некоторые разъяснения по поводу проблемы:

cheery@ruttunen:~/Documents/g386$ gcc dev/shared_test.c -L. -lshared -m32
/tmp/cc6qBViY.o: In function `main':
shared_test.c:(.text+0xa): undefined reference to `example_function'
collect2: ld returned 1 exit status
cheery@ruttunen:~/Documents/g386$ cat dev/shared_test.c 
// gcc shared_test.c -L. -lshared -m32
// LD_LIBRARY_PATH=. ./a.out
#include <stdio.h>

extern int example_function();

int main(){
    printf("hello %d\n", example_function());
}
cheery@ruttunen:~/Documents/g386$ readelf -D -s libshared.so 

Symbol table for image:
  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name
    2   0: 00800164     0    FUNC GLOBAL DEFAULT ABS example_function
    1   0: 008000ac     0  OBJECT GLOBAL DEFAULT ABS _DYNAMIC

Ответы [ 2 ]

1 голос
/ 25 января 2010

Лучший подход - добавить таблицы разделов, требуемые для gcc. Если у вас есть работающий механизм динамической компоновки в генераторе, для него требуется та же информация, что и для вставки в таблицы разделов.

Для лени я написал общий файл сборки и использовал команду strip для получения контрольной точки. «Readelf --sections» показывает несколько разделов, но они вам не нужны. Я работал над этим и реализовывал разделы по порядку, пока он не начал работать правильно. Вот что я должен был добавить:

cheery@ruttunen:~/Documents/g386$ readelf --sections dynamic_hello.app 
There are 5 section headers, starting at offset 0x1b9:

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .shstrndx         STRTAB          00000000 000281 000024 00      0   0  1
  [ 2] .dynamic          DYNAMIC         00000000 0000b0 000050 08  WA  3   0  4
  [ 3] .dynstr           STRTAB          00000000 000158 000020 00   A  0   0  1
  [ 4] .dynsym           DYNSYM          00000000 000100 000040 10   A  3   0  4
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Это не повредит, если вы добавите больше разделов, чем эти, но этого достаточно для работы динамического связывания.

1 голос
/ 25 января 2010

gcc (то есть ld позади gcc) имеет параметр командной строки для игнорирования неразрешенных внешних объектов. Это подавит сообщение об ошибке, которое вы получаете от gcc. Я не уверен, что это сделает тебя счастливым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...