Компиляция в пи-код?

Тема в разделе "LANGS.C", создана пользователем Rel, 15 фев 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    возможна ли под виндой? (под пи-кодом имеется ввиду position independent code)... в g++ есть флаг -fPIC, подобного флага похоже нет ни в VS, ни в MinGW... понятно, что винде это не особо нужно, но все же... код должен уметь работать при любом (конечно же с учетом выравнивания) базовом адресе, но при этом не иметь таблицу релокаций... возможно стоит посмотреть на кодогенерацию так называемых raw-binary?
     
  2. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Rel
    А разве в мингв не гцц?
    :S
     
  3. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    MinGW это и есть gcc порт под Windows.
     
  4. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    cppasm
    А я думал что это Миниал Гну он виндовс....
    То есть это как-бы гну-окружение, а гцц там потому, что входит туда...
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    так и есть... mingw32-gcc.exe и mingw32-g++.exe... и похоже, я ошибся, там есть -fPIC, просто надо было указывать этот флаг при компиляции и -fpie при линковке... похоже работает, но на серьезных примерах не проверял пока что... какие идеи относительно компилятора от майкрософт (msvc)?
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Rel
    Такого там нет, вроде.
    Ещё интелловский поддерживает вроде.
     
  7. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Принцип создания базонезависимого кода я брал здесь: http://www.exploit.in/forum/index.php?showtopic=21019
    вроде бы Cr4sh первым придумал. там фишка в поиске API функций по хэшам их имён. так-то весь код из-под msvc вылезает базонезависимым, за исключением вызова API и тех случаев, где требуется указатель на функцию. первый вопрос там решён, со вторым приходится припариться.
     
  8. Voodoo

    Voodoo New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2003
    Сообщения:
    297
    Адрес:
    Новосибирск
    krabz
    это очень древняя техника. как минимум на васме есть статья sars-а от 2003 г. и она наверняка не первая.
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    да это даже к ксакепе было... вопрос не в этом...
     
  10. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    "Техника" (:
     
  11. wf_

    wf_ New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2009
    Сообщения:
    40
    для msvc - /FIXED:no /DYNAMICBASE если я правильно понял суть вопроса
     
  12. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    компиляции в пикод недостаточно. нужна еще и линковка в пикод.
    ну, или, что проще, загрузчик разруливающий релоки
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    в этом случае создадутся релоки... нужен базонезависимый код без релоков...

    не, загрузщик - не вариант...
     
  14. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Rel
    если загрузчик не и релоки не, то забудьте про большой компилятор.
    ассемблер (фасм, видимо) и/или, может, небольшой опенсорсный С компилер (надо ж както решить вопрос с релоками на память? както предварительно развернуть бсс итд)
    (можно только линкер от него. к памяти то привязывает линкер. если вам такое нравится - могу подарить нечто в таком духе. С + асм гасового стиля + линкер. все в сорцах)

    ну, или еще что. ов лихо (по ключу) переносит все константы в код, но изменяемую память и бсс вам, вроде, ни один большой компилер с кодом не смешает. хотя, я особо тут экспериментов не проводил.

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

    каких еще полуфантазий (полу, потому, что это делается. фантазий, потому что делается оно не само по себе) вам нагенерить?
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    будьте так добры... интересно было бы посмотреть...

    ну вообще mingw близок к истине... но тут еще дело в том, что под x64 тоже надо собирать, хотя там вроде все переходы относительные, так что можно попробывать и студией... или разобраться с mingw-w64, я еще не пробывал ее ставить...

    да, это интересный вариант, но к сожалению есть суровые требования к размеру, а заембеденный жит накинет еще добрую сотню килобайт...
     
  16. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Если не трудно, объясните, пожалуйста как он так умудряется связать разные секции и без релоков? Вот например трудности возникают с константными стрингами, приходится их записывать так:
    Код (Text):
    1. char str[] = {'s', 't', 'r', 'i', 'n', 'g', 0};
    чтобы они создавались на стеке. Константные строки компилятору приходится размещать целиком в отдельной секции, хотя можно их и в секции кода разместить, но это ничего не меняет - ведь требуется указатель на эту строку, а где его взять, если не известна база? Мне просто непонятно чисто теоретически как это возможно сделать на уровне компилятора?
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    krabz
    дельта-смещениями, как еще
     
  18. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Rel
    в acк генератор асма из виртуального кода занимает ~50кб. есть там и генератор машкода, но я его не собирал
    я говорю про ack и кен-сс
    общего в них то, что кодогенерация в них выполняется линкером или пост-линкером.
    и то и то собирается под вынь.
    если вас такое интересует, то могу завтра посмотреть в каком месте в кен-сс линкера задается начальный адрес сборки и выложить собранные под вынь образцы.
     
  19. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    GoldFinch
    компилер во время компиляции не знает адресов символов в других модулях? также как и послесборочных адресов своих же данных?
    а как импорт присоединять через дельта-смещения. делать таблицы с указанием каждой точки внешнего вызова (call (offset MessageBeep) - $), а при загрузке править всех их. это отличная идея?
     
  20. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    link-time code generation же...