Можно ли связать символы таблицы .symtab в исполняемом файле? - PullRequest
1 голос
/ 02 мая 2020

Задано ниже main. c:

#include <stdio.h>

void test()
{
  printf("test()\n");
}

int main() {
  test();
  return 0;
}

Выполнить следующие команды:

clang-10 main.c -o main
readelf -s main

Вывод на вставку скопирован сюда:

Symbol table '.dynsym' contains 4 entries:
... ignore ...

Symbol table '.symtab' contains 62 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
   61: 00000000004004f0    23 FUNC    GLOBAL DEFAULT   13 test

Вопрос :

  1. Возможно ли для других перемещаемых объектов (объектный файл или библиотека stati c) или совместно используемой библиотеки или исполняемого файла использовать / ссылаться на / доступ к символу test в. таблица symtab?

Примечание: Спасибо за обзор вопроса, этот вопрос только для образовательных целей, у меня нет реальной проблемы с этим.

Редактировать: Экспортировать тест символ в исполняемой динамической таблице c:

clang-10 main.c -Wl,--dynamic-list=symbols.txt -fPIC -o main

symbols.txt:
{
    test;
};

Символ test отображается в таблице .dymsym.

Создайте еще одну общую библиотеку из исходного кода файл (общий доступ. c) зависит от указанного выше исполняемого файла main :

extern void test();

void share() {
  test();
}

Команда построения:

clang-10 shared.c main -fPIC -shared -o libShared.so

Однако сборка завершилась неудачно и приведена ниже сообщение об ошибке:

main: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
main: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/crtbeginS.o:(.data.rel.local+0x0): first defined here
main: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/crtendS.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
main:(.data+0x10): first defined here
/usr/bin/ld: error in main(.eh_frame); no .eh_frame_hdr table will be created.

1 Ответ

0 голосов
/ 02 мая 2020

Возможно ли

Нет.

для других перемещаемых объектов (объектный файл или библиотека stati c)

Эта часть вопроса не имеет смысла: ссылка .o файл против .symtab для получения что ?

Если вы имеете в виду, добавьте дополнительный foo.o в существующий исполняемый файл, ответ нет: ELF компоновщики считают исполняемый файл final . Большая часть информации, необходимой для перестроения исполняемого файла, отбрасывается после ссылки, и без этой информации разбить исполняемый файл на части и перестроить его заново с добавлением нового кода практически невозможно.

Существует один компоновщик (в AIX) который позволяет разбить и перестроить такой раздел, но он не использует формат ELF.

или разделяемый lib

No: динамик c компоновщик не может использовать .symtab. Это символ, который нужно экспортировать в таблицу символов Dynami c.

Вы можете построить свой исполняемый файл с флагом -Wl,--export-dynamic, и тогда функция будет присутствовать в .dynsym и может использоваться другими общими библиотеками.

или исполняемым файлом для использования / ссылки на / для доступа к символу теста в таблице .symtab?

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

Обновление:

clang-10 shared.c main -fPIC -shared -o libShared.so

Как я уже говорил, вы не ссылаетесь на исполняемый файл main.

Команда Вы ищете:

clang-10 shared.c -fPIC -shared -o libShared.so

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

...