Расположение функций при линковке ld

Тема в разделе "WASM.UNIX", создана пользователем shi, 2 окт 2006.

  1. shi

    shi New Member

    Публикаций:
    0
    Регистрация:
    27 июл 2006
    Сообщения:
    41
    Всем привет!

    Мне нужно следующее: каким-либо образом определять начало/конец слинкованного объектного файла С.
    Это нужно, чтобы потом эту область можно было затереть и занять другим модулем или данными.

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

    Как вариант, уже проверенный, можно вставлять между двумя объектниками код на nasm:
    Код (Text):
    1. global border_ith
    2. border_ith:
    Но, с учётом немалого к-ва модулей, это решение весьма громоздкое, хотя и вполне, вроде, приемлемое в остальных отношениях
     
  2. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Порядок формально детерминирован, но никем не гарантирован. И может менятся как от смены порядка компиляции/линковки, так и от внесения изменений в исходные файлы.

    Все адреса явно указаны в map файле. Ну или objdump'ом (для отдельного .o файла).
    Если нужно расположить какие-то секции по определенным адресам, то надо читать доки по скриптам ld и править например файл i386elf.x.
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Nothing
    Верно. Именно в нём задаётся порядок секций. В обьектнике можно задать секциям уникальные имена и потом указать эти имена в i386elf.x в нужном месте и порядке.