Извлечь раздел из объектного файла в отдельный.o

У меня есть язык C, gcc toolchain, объектные файлы в формате elf32.

Допустим, у меня есть функция a() это включает в себя вызов функции b(), Если они находятся в одном файле.c, результирующий файл.o содержит .text.a а также .text.b секции, .rel.text.a содержит ссылку на символ "b", а таблица символов содержит символ "b", относящийся к разделу .text.b,

Если только a() включается в исходный код, тогда результирующий объектный файл содержит только .text.a раздел, .rel.text.a содержит ссылку на символ "b", а таблица символов содержит символ "b", который не ссылается на какие-либо символы (Ndx = UND). В этом случае ссылка на символ разрешается компоновщиком в более позднем состоянии.

Я хочу получить второй объектный файл (без .text.b раздел, содержащий только .text.a и символ "b", который ни на что не ссылается) без удаления функции b() определение из источника.

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

Команды как objcopy -j .text.a file.o test.o, objcopy -R .text.b file.o test.o, objcopy --add-symbol b=0 -j .text.a file.o test.o и т.д. заканчиваются следующей ошибкой:

objcopy: build/test.o: symbol `b' required but not present
objcopy:build/test.o: No symbols

Я не могу понять, как отменить или экстернализировать символы.

1 ответ

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

Самым простым решением является предварительная обработка исходного файла, разбивая его на несколько временных файлов, которые затем компилируются отдельно. Пример:

// file.c
int a()
{
  return b();
}
int b()
{
  return 42;
}

sed -e '/^int b/,$d' file.c | gcc -c -xc - -o file.a.o
sed -e '1,/^}/d' file.c | gcc -c -xc -o -o file.b.o
Другие вопросы по тегам