Мне нужно связать программу C с общим объектом без заголовков разделов

Я написал интерфейс для генератора кода, который позволяет мне создавать общие объекты. Хотя я не хочу реализовывать поддержку таблицы заголовков разделов, потому что в ней остается большая часть сложности формата файла 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

person Cheery    schedule 24.01.2010    source источник
comment
Не могли бы вы уточнить это, пожалуйста? У вас есть таблица символов? Каково ваше определение общего объекта?   -  person Richard Pennington    schedule 24.01.2010
comment
Конечно. Я положил пасту, которая показывает некоторый контекст. Я надеюсь, что этого достаточно.   -  person Cheery    schedule 24.01.2010
comment
Это кажется бесполезным упражнением; вы хотите сгенерировать код для связывания общих объектов, не предоставляя информацию, которая позволит динамическому загрузчику найти символы, предоставляемые общим объектом. Вы правы в том, что сложность ELF заключается в разделах, но разделы имеют решающее значение для его правильной работы.   -  person Jonathan Leffler    schedule 24.01.2010
comment
Хе-хе. Вы правы. Я проделал некоторую работу, чтобы добавить информацию о таблице разделов в мои файлы ELF, и на самом деле это было меньше работы, чем попытка заставить GCC работать с моими библиотеками.   -  person Cheery    schedule 25.01.2010


Ответы (2)


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

person user231967    schedule 25.01.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)

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

person Cheery    schedule 25.01.2010