C-программа, которая после компиляции и компоновки приводит к EXE-файлу с разделом edata? - PullRequest
1 голос
/ 07 марта 2019

Я рассматриваю спецификацию Microsoft по переносимым исполняемым файлам (EXE-файлам). В частности, я рассматриваю раздел .edata (данные экспорта). Вот что сказано в спецификации о разделе edata :

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

Может ли не-DLL-файл иметь раздел edata? В частности, может ли программа на C после компиляции и компоновки создать файл EXE, содержащий раздел edata? Если да, не могли бы вы показать простую программу на C, которая после компиляции и компоновки приводит к EXE-файлу, содержащему раздел edata, пожалуйста?

1 Ответ

3 голосов
/ 08 марта 2019

Любой файл образа PE может содержать таблицу экспорта, независимо от того, является ли это EXE или DLL. Однако таблицы экспорта не обязательно содержатся в разделе .edata. Например, обычно вместо таблицы .rdata отображаются таблицы экспорта.

Чтобы найти таблицу экспорта, вы должны использовать каталог данных таблицы экспорта и вообще не полагаться на таблицу разделов.

Ниже приведен пример программы на C, которая при компиляции создаст EXE с таблицей экспорта. Однако он не может быть помещен в раздел .edata (а в EXE может вообще не быть раздела .edata).

#include <stdio.h>

__declspec(dllexport) void some_func(void)
{
    printf("Hello\n");
    return;
}

int main()
{
    return 0;
}

Когда я компилирую эту программу с использованием Visual Studio 2017 в моей системе и запускаю dumpbin /HEADERS /EXPORTS в полученном EXE-файле, я вижу следующее:

...

SECTION HEADER #3
  .rdata name
    2A94 virtual size
   19000 virtual address (0000000140019000 to 000000014001BA93)
    2C00 size of raw data
    7E00 file pointer to raw data (00007E00 to 0000A9FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

...


  Section contains the following exports for SampleApp.exe

    00000000 characteristics
    FFFFFFFF time date stamp
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 0001108C some_func = @ILT+135(some_func)

, который подтверждает, что в этом случае таблица экспорта была помещена в раздел .rdata.

...