Убрать секцию .idata

Тема в разделе "LANGS.C", создана пользователем Praetor11, 26 янв 2011.

  1. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Всем доброго времени суток!

    Недавно встретил проблему при создании exe файла небольшого размера используя линкер ld (тот что в пакете с Dev-Cpp). В общем проблема заключается в следующем: исходный код состоит из одной пустой функции, никакие стандартные библиотеки не подключены (флагом -nostdlib). Выходной ехе файл получается такой какой нужно, но с одной проблемой: он содержит две секции вместо одной (должна быть только секция кода, но присутствует секция с таблицей импорта .idata). Таблица импорта данного ехе абсолютна пуста (т.е. по сути лишь содержит ей окончание из стандартного скрипта линкера:
    .idata BLOCK(__section_alignment__) :
    {
    /* This cannot currently be handled with grouped sections.
    See pe.em:sort_sections. */
    SORT(*)(.idata$2)
    SORT(*)(.idata$3)
    /* These zeroes mark the end of the import list. - Вот собственно только это и содержится */
    LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
    SORT(*)(.idata$4)
    SORT(*)(.idata$5)
    SORT(*)(.idata$6)
    SORT(*)(.idata$7)
    }
    По идее, линкер на заключительной стадии сборки удаляет все пустые секции, но в данном случае эта секция оказывается не пустой (т.к. есть эти пять значений LONG) и не удаляется из ехе хотя она по сути бесполезна.
    Если создать собственный скрипт линкера без этой секции то все работает. Собственно вопрос1: можно ли решить данную проблему без использования собственного скрипта? и вопрос2: Обязательны ли эти zeroes mark в окончании таблицы импорта, без них она будет работать корректно?

    Всем заранее спасибо за ответы.
     
  2. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Ну так попробуй с мерджить её с секцией text
    Если в MSVC это делалось через #pragma comment(linker, "/MERGE:.idata=.text")
    то должно быть подобие и для gcc
     
  3. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Нет прагма комменты не работают в лд (
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    В LD работают скрипты.
    Чем не устраивает собственный скрипт?
     
  5. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Эм ну вобщем то ничем, но их пишешь под конкретные нужды, а стандартный скрипт кажется универсален, но выдает в исходник пустую секцию (в случае отсустсвия импортируемых функций). Можно ли удалить нулевые LONG из секции импорта но чтобы она работала корректно в случае её наличия?
     
  6. triumhiz

    triumhiz New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2011
    Сообщения:
    5
    Попробуйте
    objcopy --remove-section=sectionname infile [outfile]

    Утилита должна быть в комплекте с dev-cpp.
    Хотя она, наверное, и непустую секцию удалит...