Как создать «пустое» пространство в исполняемом файле по определенному адресу (gcc, linux)? - PullRequest
3 голосов
/ 01 октября 2009

По сути, я хочу, чтобы другая программа записывала данные в это «пустое место», чтобы исполняемый файл «работал» на

Я думал добавить подпись в приложение, а затем записать данные, чтобы потом их искать, но это звучит не совсем правильно ...

Теперь еще одна важная вещь ... Я знаю, что можно создать пещеру с использованием кода вроде:

void function(void) {
__asm {
nop
nop
nop
nop
};
}

тогда, даже это практически то же самое (кроме того факта, что оно будет в разделе .data, поэтому не выполнимо):

const char data[3];

Проблема в том, что у другого приложения не будет определенного адреса для записи.

Ответы [ 3 ]

7 голосов
/ 01 октября 2009

По крайней мере, для PE и ELF вы можете добавлять данные в конец исполняемого файла, не затрагивая программу вообще.

Стандартный подход - добавить ваши данные в исполняемый файл, а затем добавить число, указывающее, сколько байтов было добавлено. Затем исполняемый файл открывает себя для чтения, просматривает последние N байтов, указывающих длину данных, и затем seek s в обратном направлении на это значение до начала добавленных данных.

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

3 голосов
/ 01 октября 2009

Используйте скрипт компоновщика ld, чтобы создать новый раздел и зарезервировать фактическое пространство в образе файла. Вам также необходимо связать символ с новым разделом данных. Возможно, вместо этого было бы еще проще создать короткий файл сборки, например:

.section .myresource
.align 4
.globl myres
myres:
.fill 1048576

Тогда в вашем C-коде вы используете символ для получения данных, например:

extern const int* myres;

Ознакомьтесь с документацией на binutils здесь: http://sourceware.org/binutils/docs-2.19/

0 голосов
/ 01 октября 2009

вы можете делать то, что просили, используя сценарии компоновщика .

в основном, имя_функции = адрес в скрипте.

...