У вас нет перемещенных объектных файлов в памяти.
Я предполагаю, что у вас есть система 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.
Почему вы используете в EXE-суффикс? – rubenvb
Поскольку оригинальный плакат использовал суффикс '.exe' –
А, тогда OP, вероятно, использовал GCC для Windows, и все ваши материалы о' mmap' и ELF не имеют значения. – rubenvb