2013-04-17 5 views
1

Допустим, у меня есть файл A.c и скомпилируйте его в файл A.o. Файл A.c выглядит следующим образом:обмен памяти в .o файле

int a; 
void add(void) 
{ 
} 

В A.o файл вместе с B.o образуют 1.exe файл. Файл A.o вместе с C.o форму 2.exe файл.

Мой вопрос, если я бег 1.exe и 2.exe в то же время, будет адрес a и add() быть одинаковым для этих два .exe файла? В другом слове, есть ли в памяти два A.o или есть только один?

ответ

1

У вас нет перемещенных объектных файлов в памяти.

Я предполагаю, что у вас есть система Linux. Если в Windows принципы остаются неизменными, но детали разные.

Компоновщика (так называемый построить как 1.exe и 2.exe) построить исполняемый ELF файл (состоит из нескольких сегментов, в частности, так называемые "text" segment для машинного кода и только для чтения постоянных данных, и "data" segment для изменяемых данных). Сценарий execve(2), начинающийся с этой программы, представляет собой карту памяти, отображающую несколько сегментов файла ELF (примерно так же, как и для системного вызова mmap(2)).

Обратите внимание, что использование суффикса файла .exe для исполняемых файлов Linux является сбивающим с толку и необычным. Обычно исполняемые файлы Linux не имеют никакого суффикса и начинаются с строчной буквы.

Линкер скопировал и переместил и A.o файлы в разные предметы (из-за relocation). Так обычно бывает, что адрес a или add отличается от 1.exe и в 2.exe, а также инструкции по работе с ними.

У каждого process есть свой собственный address space (который может быть изменен, например, с помощью mmap(2)). Введите cat /proc/1234/maps, чтобы узнать адресное пространство pid 1234. Попробуйте также: cat /proc/self/maps, чтобы получить адресное пространство процесса cat.

Если вместо A.o объекта у вас есть общий объект (или динамическая библиотека) libA.so некоторые из его (mmap -ed) сегментов будут разделены (и другие будут использовать copy on write методы), а некоторые перемещение происходит в динамической (например, во время dlopen, если это плагин).

также читайте также Levine's book on Linkers and Loaders.

+0

Почему вы используете в EXE-суффикс? – rubenvb

+0

Поскольку оригинальный плакат использовал суффикс '.exe' –

+0

А, тогда OP, вероятно, использовал GCC для Windows, и все ваши материалы о' mmap' и ELF не имеют значения. – rubenvb

1

Адреса a и add не совпадают. У вас есть два процесса, поэтому в этом случае две копии в памяти.

0

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

его как функция printf ... существует так много printf любых файлов diff diff, но в то время только один экземпляр запущен в памяти ... функции

возвратных не должны доставить любые повреждения данных, что и должен заботиться о

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