".o" файлы "загружаемы"? - PullRequest
0 голосов
/ 19 февраля 2012

Я читал компоновщики и загрузчики Джона Р. Левина и прочитал, что свойства объектного файла будут включать одно или несколько из следующих значений.

  1. файл должен быть связан с
  2. файл должен быть загружаемым
  3. файл должен быть исполняемым

Теперь рассмотрим этот пример:

#include<stdio.h>
int main() {
  printf("testing\n");
  return 0;
}

Который я скомпилирую и свяжу с:

$ gcc -c t.c
$ gcc -o t t.o

Я попытался проверить t.o, используя objdump, и его тип отображается как REL.Каким всем свойствам удовлетворяет t.o?Я считаю, что его можно связать, не выполнимо.Я бы поверил, что его нельзя загрузить (если вы не создадите файл .so из файла .o);однако тип REL означает, что он должен быть перемещен, и перемещение будет происходить только в контексте загрузки, поэтому у меня возникла путаница.Мои сомнения подытожены: -

  1. Являются ли файлы ".o" loadable?
  2. Ресурсы чтения относительно разделов, присутствующих в файле ".o", ".so" - различияи т. д.

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

Объектный файл (т. Е. Файл с расширением .o) не загружается.Это связано с тем, что ему не хватает критически важной информации о том, как разрешить все символы в нем: в этом случае, в частности, символу println потребуется дополнительная информация.(Компиляторы C не связывают идентификаторы библиотеки в создаваемых ими объектных файлах, что иногда даже полезно.)

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

Переход оттуда к исполняемому файлу, как правило, является просто вопросом добавленияв операционной системе, определенной программой начальной загрузки.Это небольшой фрагмент кода, который ОС запускает, вызывая программу, и обычно работает, загружая остальную часть программы и зависимостей, а затем вызывая main() с информацией об аргументах.(Он также отвечает за корректный выход, если main вернется.)

1 голос
/ 19 февраля 2012

Просто чтобы установить контекст эта ссылка сообщает что-то похожее (акцент только на удобочитаемости);

Файл может быть с возможностью связи , используемый в качестве ввода редактором ссылок или связыванием погрузчик. Это может быть исполняемый файл , способный быть загруженным в память и запуск в качестве программы, загружаемый , способный к загрузке в память как библиотека вместе с программой или любой комбинацией три.

.o файл - это объектный файл компоновщика, который в соответствии с этим определением не является исполняемым и определенно связываемым . Загрузка - сложный вызов, но поскольку файлы .o не могут быть загружены без каких-либо определенно не кроссплатформенных хитростей, я бы сказал, что суть в том, что не загружается .

...