возможна ли под виндой? (под пи-кодом имеется ввиду position independent code)... в g++ есть флаг -fPIC, подобного флага похоже нет ни в VS, ни в MinGW... понятно, что винде это не особо нужно, но все же... код должен уметь работать при любом (конечно же с учетом выравнивания) базовом адресе, но при этом не иметь таблицу релокаций... возможно стоит посмотреть на кодогенерацию так называемых raw-binary?
cppasm А я думал что это Миниал Гну он виндовс.... То есть это как-бы гну-окружение, а гцц там потому, что входит туда...
так и есть... mingw32-gcc.exe и mingw32-g++.exe... и похоже, я ошибся, там есть -fPIC, просто надо было указывать этот флаг при компиляции и -fpie при линковке... похоже работает, но на серьезных примерах не проверял пока что... какие идеи относительно компилятора от майкрософт (msvc)?
Принцип создания базонезависимого кода я брал здесь: http://www.exploit.in/forum/index.php?showtopic=21019 вроде бы Cr4sh первым придумал. там фишка в поиске API функций по хэшам их имён. так-то весь код из-под msvc вылезает базонезависимым, за исключением вызова API и тех случаев, где требуется указатель на функцию. первый вопрос там решён, со вторым приходится припариться.
krabz это очень древняя техника. как минимум на васме есть статья sars-а от 2003 г. и она наверняка не первая.
компиляции в пикод недостаточно. нужна еще и линковка в пикод. ну, или, что проще, загрузчик разруливающий релоки
в этом случае создадутся релоки... нужен базонезависимый код без релоков... не, загрузщик - не вариант...
Rel если загрузчик не и релоки не, то забудьте про большой компилятор. ассемблер (фасм, видимо) и/или, может, небольшой опенсорсный С компилер (надо ж както решить вопрос с релоками на память? както предварительно развернуть бсс итд) (можно только линкер от него. к памяти то привязывает линкер. если вам такое нравится - могу подарить нечто в таком духе. С + асм гасового стиля + линкер. все в сорцах) ну, или еще что. ов лихо (по ключу) переносит все константы в код, но изменяемую память и бсс вам, вроде, ни один большой компилер с кодом не смешает. хотя, я особо тут экспериментов не проводил. еще вариант взять жит компилятор и кодогенерить сразу по месту. ллвм, вроде имеет жит и большие фронтенды. каких еще полуфантазий (полу, потому, что это делается. фантазий, потому что делается оно не само по себе) вам нагенерить?
будьте так добры... интересно было бы посмотреть... ну вообще mingw близок к истине... но тут еще дело в том, что под x64 тоже надо собирать, хотя там вроде все переходы относительные, так что можно попробывать и студией... или разобраться с mingw-w64, я еще не пробывал ее ставить... да, это интересный вариант, но к сожалению есть суровые требования к размеру, а заембеденный жит накинет еще добрую сотню килобайт...
Если не трудно, объясните, пожалуйста как он так умудряется связать разные секции и без релоков? Вот например трудности возникают с константными стрингами, приходится их записывать так: Код (Text): char str[] = {'s', 't', 'r', 'i', 'n', 'g', 0}; чтобы они создавались на стеке. Константные строки компилятору приходится размещать целиком в отдельной секции, хотя можно их и в секции кода разместить, но это ничего не меняет - ведь требуется указатель на эту строку, а где его взять, если не известна база? Мне просто непонятно чисто теоретически как это возможно сделать на уровне компилятора?
Rel в acк генератор асма из виртуального кода занимает ~50кб. есть там и генератор машкода, но я его не собирал я говорю про ack и кен-сс общего в них то, что кодогенерация в них выполняется линкером или пост-линкером. и то и то собирается под вынь. если вас такое интересует, то могу завтра посмотреть в каком месте в кен-сс линкера задается начальный адрес сборки и выложить собранные под вынь образцы.
GoldFinch компилер во время компиляции не знает адресов символов в других модулях? также как и послесборочных адресов своих же данных? а как импорт присоединять через дельта-смещения. делать таблицы с указанием каждой точки внешнего вызова (call (offset MessageBeep) - $), а при загрузке править всех их. это отличная идея?