Боюсь, что нет.
Скомпилированный двоичный файл обработан на этапе перемещения компоновщиком, который связывает каждую ссылку на символ в коде с адресом времени выполнения.
Вы можете провести простой эксперимент, чтобы выяснить различия, вот программа, которая выводит «Hello World»:
// main.c
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
Используя gcc -c
, вы можете скомпилировать исходный код в перемещаемый объект:
$ gcc -c main.o
$ readelf -s main.o
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS main.c
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000000 0 SECTION LOCAL DEFAULT 5
6: 00000000 0 SECTION LOCAL DEFAULT 7
7: 00000000 0 SECTION LOCAL DEFAULT 6
8: 00000000 29 FUNC GLOBAL DEFAULT 1 main
9: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf
Отсюда видно, что значение функции main равно 0x0, что означает, что она еще не перемещена и может быть связана с другими.
Но когда вы компилируете файл с помощью команды gcc
, для генерации исполняемого файла:
$ gcc main.c
$ readelf -s a.out | grep main
2: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (2)
39: 00000000 0 FILE LOCAL DEFAULT ABS main.c
51: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
62: 080483c4 29 FUNC GLOBAL DEFAULT 13 main
Теперь вы можете видеть, что адрес функции main был перемещен в 0x80483c4, который является адресом времени выполнениякода функции.Генерирование a.out
больше не может быть связано с другими, так как это может привести к нарушению адреса времени выполнения.
Вообще говоря, этап перемещения не может быть отменен, поскольку некоторая информация о символах теряется после фазы.
Для получения более подробной информации, я предлагаю вам прочитать главу «Связывание» в книге Компьютерная система: перспективы программиста , в которой много говорится о связывании и перемещении.