Position-independent code

Discussion in 'WASM.BEGINNERS' started by Aspire, Aug 22, 2007.

  1. Aspire

    Aspire New Member

    Blog Posts:
    0
    Есть некий базонезависимый код, который работает в чужом модуле опираясь на расчитанную дельту. Из этого кода вызывается callback-функция процедура которой находится в том же модуле. Когда управление передается на эту процедуру, то дельта теряется, соответсвенно все адреса начинают указывать нетуда куда хотелось бы.
    Каким образом можно передать дельту callback-процедуре, если из материнской функции, передачи параметров не предусмотрено ?
     
  2. MSoft

    MSoft New Member

    Blog Posts:
    0
    Aspire
    а вычислить?
     
  3. Aspire

    Aspire New Member

    Blog Posts:
    0
    Снова? Может, как-то подругому можно ?
     
  4. MSoft

    MSoft New Member

    Blog Posts:
    0
    Ну если колбэк твой и вызываешь его ты, тогда через стек/регистр передать можно. Но я бы рекомендовал заново вычислить - имхо так проще
     
  5. Aspire

    Aspire New Member

    Blog Posts:
    0
    В том то и дело что не я, а винда...
     
  6. dead_body

    dead_body wasm.ru

    Blog Posts:
    0
    только вычислять. или у некоторых коллбыков есть параметр. Через него можно.
    Но вычислять вроде 3 строки. Потому легче вычислить.
     
  7. Aspire

    Aspire New Member

    Blog Posts:
    0
    Меня клинит или так и есть? При расчете дельты (в одном из расчетов) мы обращаемся к адресу по которому расположена метка. Вызываем ее через call, либо тупо загружем ее адрем директивой lea...В связи с этим, вопрос: значит ли это то, что метка в чужом адресном пространстве будет всегда иметь правильное смещение ? (раз мы вызываая ее через call попадаем именно на нее). Почему бы тогда в шелл коде и переменные не обозначать через метки?
    Типа perem1: dd 0
    perem2: dd ?
    а не вызывать их прибавляя к смещению вычисленную дельту.
    Или меня переглючило после тяжелых рабочих дней ???
     
  8. MSoft

    MSoft New Member

    Blog Posts:
    0
    Нет, не правильно. Смещение метки будет абсолютным. Т.е. например 403000. А в другом процессе оно может быть любым. А обращаться программа будет все равно к 403000. Дык вот, чтобы не было глюка, и используется дельта.
    Дело в том, что call'ы используют относительные адреса! То, что ты видишь в отладчике call 403000 (например) - это только отладчик специально для тебя сделал расчет и показал, куда идет прыжок. На самом деле, вместо адреса, куда прыгать, в call будет стоять разница между текущим адресом (т.е. адресом команды call) и местом, куда надо прыгнуть.

    P.S.: насчет lea не знаю, потому не могу точно сказать.
     
  9. JAPH

    JAPH New Member

    Blog Posts:
    0
    адресом следующей за call команды

    В опкоде call относительное смещение, в опкоде lea абсолютное, и рассчитывается оно при ассемблировании. eg. lea eax, param1 <=> mov eax, offset param1.
     
  10. MSoft

    MSoft New Member

    Blog Posts:
    0
    виноват, ошибся :)