2012-02-19 1 views
0

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

  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» - различия и т. Д.?

ответ

1

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

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

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

+0

программой bootstrap, вы имеете в виду libc_start_main? –

+1

@eQuiNoX__ Я имею в виду код, который обычно находится (до связывания) в файле, который называется «crt0.o», хотя современные линкеры могут фактически содержать код внутри. –

+0

Обычно символ _start –

1

Просто для установки контекста this link утверждает что-то подобное (выделение только для чтения);

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^