Позиционно-независимый код

16 messages Options
Embed this post
Permalink
Yuriy Zhilovets

Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Привет всем!

После изучения исходников я пришел к выводу, что позиционно-зависимый
код используется только в следующих местах:

1) В полях CFA и LFA
2) В словарях
3) Генерируется оптимизатором.

Предлагаю в случаях 1) и 2) поставить смещения от IMAGE-BASE. Тогда при
отключенном оптимизаторе у нас будет получаться позиционно-независимый
код, и можно будет легко создавать динамические библиотеки.

Ю. Жиловец



Ruvim Pinka

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Привет!

On 5/2/07, Yuriy Zhilovets <[hidden email]> wrote:

> 1) В полях CFA и LFA
> 2) В словарях
> 3) Генерируется оптимизатором.
>
> Предлагаю в случаях 1) и 2) поставить смещения от IMAGE-BASE.

Может, лучше от текущего адреса, как в JMP и CALL?

> Тогда при отключенном оптимизаторе у нас будет получаться
> позиционно-независимый код, и можно будет легко
> создавать динамические библиотеки.

Возможно, код ядра и получиться позиционно-независимым, но код
произвольной программы — нет. У вас уже есть стоящая программа,
которая очень нужна в позиционно-независимом бинарном виде, и код
которой написан с соответствующими ограничениями, ради которой стоит
затевать сыр-бор? :)

--
Ruvim
Yuriy Zhilovets

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Ruvim Pinka пишет:

>Может, лучше от текущего адреса, как в JMP и CALL?
>  
>
Мне кажется, что отмерять от начала будет единообразней и проще. Не надо
вычислять, в каком месте мы находимся сами.

>Возможно, код ядра и получиться позиционно-независимым, но код
>произвольной программы — нет.
>
Это уже пусть будет на совести пишущего.

>У вас уже есть стоящая программа,
>которая очень нужна в позиционно-независимом бинарном виде, и код
>которой написан с соответствующими ограничениями, ради которой стоит
>затевать сыр-бор? :)
>
Сыр-бор будет не очень большой и локализуется практически в файле
spf_wordlist.f
Заодно будут наказаны те, кто не пользовался словом CDR :-)
По сравнению с пользой изменения не слишком значительные, так что стоит
подумать.

У меня самого такой программы нет, но вопрос актуальный для многих.
Большое количество программ требуют расширения в виде DLL.
Кажется, ygrek делал модули для ФАРа. Одному знакомому требовалась DLL
для стыковки с сервером Jabber и он вынужден был пользовать какой-то
неподдерживаемый ForthEC.

Ю. Жиловец




yGREK Heretix

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink

> >У вас уже есть стоящая программа,
> >которая очень нужна в позиционно-независимом бинарном виде, и код
> >которой написан с соответствующими ограничениями, ради которой стоит
> >затевать сыр-бор? :)
> >
> Сыр-бор будет не очень большой и локализуется практически в файле
> spf_wordlist.f
> Заодно будут наказаны те, кто не пользовался словом CDR :-)
> По сравнению с пользой изменения не слишком значительные, так что
> стоит подумать.
>
> У меня самого такой программы нет, но вопрос актуальный для многих.
> Большое количество программ требуют расширения в виде DLL.
> Кажется, ygrek делал модули для ФАРа. Одному знакомому требовалась
> DLL для стыковки с сервером Jabber и он вынужден был пользовать
> какой-то неподдерживаемый ForthEC.
В моём случае это конечно развлечение было. Но генерация DLL это очень
полезная вещь. Вопрос - какой ценой? Какие могут возникнуть
несовместимости? Какие требования накладываются на программу чтобы она
могла скомпилироваться в DLL - отключение оптимизатора? ещё?

--
ygrek


attachment0 (187 bytes) Download Attachment
Ruvim Pinka

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets

On 5/4/07, Yuriy Zhilovets <[hidden email]> wrote:
 
>У вас уже есть стоящая программа, 

У меня самого такой программы нет, но вопрос актуальный для многих.

Кажется, ygrek делал модули для ФАРа.
да, и эти DLL нормально работали без позиционных ограничений на код.
Больше пользы — сделать удобным описание и генерацию dll по уже проверенной методике, которая свободна от специальных ограничений на код (такие, как запрет на прямое использование HERE, и т.п.).

Я это не делал, т.к. у меня не было задачи, ради которой стоило напрягаться :)   Как только возникнет стоящая задача — сделаю.  А иначе — это то же зло, что и преждевременная оптимизация ;)

--
Ruvim
Yuriy Zhilovets

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Ruvim Pinka пишет:

> Больше пользы — сделать удобным описание и генерацию dll по уже
> проверенной методике, которая свободна от специальных ограничений на
> код (такие, как запрет на прямое использование HERE, и т.п.).

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

А от HERE она может избавить только под Win32.
Под Линуксом DLL обязана грузиться с _любого_ адреса, поэтому методика
тут вообще не подходит. П.Н. должен быть сам код.

Ю. Жиловец



Andrey Cherezov

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 04.05.2007 20:22:
> А от HERE она может избавить только под Win32.
> Под Линуксом DLL обязана грузиться с _любого_ адреса, поэтому методика
> тут вообще не подходит. П.Н. должен быть сам код.
>  
В Win32 тоже поидее dll (да и exe) обязаны быть перемещабельными,
но на практике сначала проверяется "а может без перемещения загрузить"
(экономия времени), и это в нашем случае системе удается.


Yuriy Zhilovets

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by yGREK Heretix
ygrek пишет:

>В моём случае это конечно развлечение было. Но генерация DLL это очень
>полезная вещь. Вопрос - какой ценой? Какие могут возникнуть
>несовместимости? Какие требования накладываются на программу чтобы она
>могла скомпилироваться в DLL - отключение оптимизатора? ещё?
>  
>
Пока я нашел три места, где используется П.З.К. Может быть, я что-то
пропустил.

Несовместимости будут там, где лазят напрямую в заголовки и словари.

Программа DLL не знает заранее адреса, с которого грузится. Отсюда
вытекает все остальное.
В общем, требует внимательного, а иногда вычурного программирования при
манипуляциях с адресами.
Правда, пример с ходу и не придумаешь. Рувим писал про HERE, но никто не
мешает при загрузке его правильно установить.

Гораздо хуже, что потребуется позиционно-чистая система, то есть само
ядро должно быть собрано без оптимизатора (во всяком случае, пока Михаил
его специально не будет расширять).

Ю. Жиловец


Yuriy Zhilovets

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Andrey Cherezov
Andrey Cherezov пишет:

>В Win32 тоже поидее dll (да и exe) обязаны быть перемещабельными,
>
Вроде не должны. DLL обязаны только иметь relocation table для
перемещения при загрузке страниц.
Во всяком случае, если верить этому документу:
http://www.securitylab.ru/analytics/278480.php

Ю. Жиловец



Ruvim Pinka

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets

On 5/4/07, Yuriy Zhilovets <[hidden email]> wrote:

В общем, требует внимательного, а иногда вычурного программирования при
манипуляциях с адресами.

Именно!

Правда, пример с ходу и не придумаешь. Рувим писал про HERE, но никто не
мешает при загрузке его правильно установить.

Например, ~pinka/lib/multi/cr itical.f (адрес ячейки в области кодофайла передается API-функции), и таких примеров уйма. Обычно косвенность (как и обсуждаемое требование относительности всех ссылок) несет усложнения на уровне исходного кода. А я нахожу удовольствие в решениях, снижающих уровень косвенности для упращения исходного кода.

--
Ruvim
Andrey Cherezov

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets
Some javascript/style in this post has been disabled (why?)
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 04.05.2007 20:41:
В Win32 тоже поидее dll (да и exe) обязаны быть перемещабельными,
    
Вроде не должны. DLL обязаны только иметь relocation table для 
перемещения при загрузке страниц.
  
Вот в этом и выражается "обязаны быть перемещабельными".
Yuriy Zhilovets

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Andrey Cherezov пишет:

> Вот в этом и выражается "обязаны быть перемещабельными".

Для Линукса этого мало. Там еще требуется позиционно-независимый код, в
котором таблица перемещения нужна только для вызова внешних функций.

Ю. Жиловец



Yuriy Zhilovets

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Ruvim Pinka
Ruvim Pinka пишет:

> А я нахожу удовольствие в решениях, снижающих уровень косвенности для
> упращения исходного кода.

Иногда обстоятельства бывают сильнее наших намерений. Нужно DLL и ради
этого придется идти на усложнение.

Ю. Жиловец



Dmitry Yakimov-2

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
Привет,

Все это будет костылями. Я бы предложил написать прототип spf 5, который
принципиально генерирует перемещаемый код :)
И сделать его максимально совместимым с spf4.

Yuriy Zhilovets wrote:

> Ruvim Pinka пишет:
>
>  
>> А я нахожу удовольствие в решениях, снижающих уровень косвенности для
>> упращения исходного кода.
>>    
>
> Иногда обстоятельства бывают сильнее наших намерений. Нужно DLL и ради
> этого придется идти на усложнение.
>
> Ю. Жиловец
>  
Дмитрий.


Andrey Cherezov

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets
Some javascript/style in this post has been disabled (why?)
Добрый день, Yuriy Zhilovets!

Ваше сообщение от 04.05.2007 21:08:
Вот в этом и выражается "обязаны быть перемещабельными".
    
Для Линукса этого мало. Там еще требуется позиционно-независимый код, в 
котором таблица перемещения нужна только для вызова внешних функций.
  
В Windows таблица перемещений - это и есть средство обеспечения позиционной независимости кода (в страницах он позиционно-зависим, но в relocations указано, какие места менять при перемещениях при загрузке страниц).
А для вызова внешних функций - другая таблица - import table.
Ruvim Pinka

Re: Позиционно-независимый код

Reply Threaded More More options
Print post
Permalink
In reply to this post by Yuriy Zhilovets

On 5/4/07, Yuriy Zhilovets <[hidden email]> wrote:

> Больше пользы — сделать удобным описание и генерацию dll по уже
> проверенной методике, которая свободна от специальных ограничений на
> код (такие, как запрет на прямое использование HERE, и т.п.).

Это больше на хак похоже, чем на методику. По существу, механический
поиск перемещаемого кода

да, но это не более хак, чем оптимизатор в SPF4 :)  — работает на таком же уровне, примерно.

со многими заранее неизвестными ограничениями.
безконструктивное утверждение.


Под Линуксом DLL обязана грузиться с _любого_ адреса, поэтому методика
тут вообще не подходит. П.Н. должен быть сам код.

Позиционно-независимым достаточно быть только начальному коду (INIT), выполняющему настройку образа по таблице перемещений. Это легко сделать и без использования соответствующих функций ОС. Например, в PE нет возможности отметить подстройку для инвертированных значений (которые может дать оптимизатор). Я решил, что подстрою их и вручную (своим кодом) — это легко.

Полностью позиционно-независимый образ (не требующий подстройки) — тоже хорошо. Его не так трудно получить, пока он мал. Но, чем больше программа, тем трудней держать код в рамках, издержки начинают съедать выгоду. Поэтому, каждому свое место :)

--
Ruvim