Линковка статической либы

Вопросы по языкам программирования Си и С++.
KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Линковка статической либы

Сообщение KiloGraf » 07.04.2012 (Сб) 11:06

Проблема с линковкой не MS COFF либы, т.е. в либе имена функций не имеют косметики типа '…@@AAGXXZ'

К примеру, имеется функция 'MyFunction' т.е. в либе соответственно '_MyFunction@0', но после компиляции вызов 'MyFunction' превращается в такой вид '?MyFunction@ModuleName@@AAGXXZ'

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

Подскажите, чё делать с этим...

tag_warning(1). Первый случай неправильного размещения темы в разделе «Для профессионалов».
[Хакер] :: Перенесено в раздел «С/С++».
Nonsense in BASIC. © 1982 ...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Линковка статической либы

Сообщение Хакер » 08.04.2012 (Вс) 16:44

KiloGraf писал(а):К примеру, имеется функция 'MyFunction' т.е. в либе соответственно '_MyFunction@0', но после компиляции вызов 'MyFunction' превращается в такой вид '?MyFunction@ModuleName@@AAGXXZ'

Это сверх-элементарно.

В lib-ке имена задекорированы по правилам Си без плюсов (то есть MyFunction декорируется как _MyFunction@0).
В твоём obj-файле имена имена декорируются по правилам Си++ (то есть '?MyFunction@ModuleName@@AAGXXZ').

Решается это просто: прототип MyFunction и остальных функций из либки в твоём исходнике (в котором осуществляется вызов) нужно обрамить в extern "C" { и }
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Re: Линковка статической либы

Сообщение KiloGraf » 12.04.2012 (Чт) 16:11

Да всё было бы элементарно, я не сомневаюсь, если бы я линковал в C...
...но я подменяю .obj в VB, где создаю пустые функции и процедуры по аналогии с имеющейся библиотекой (.lib)!
Уже скомпилил из нее DLLку, в которой обернул имеющиеся функции, чтоб имена были не 'MyFunction', а '?MyFunction@ModuleName@@AAGXXZ'...
...тулзой Dll2Lib снова получил статическую либу, но уже с нужными именами, но линкер все равно ругается на неразрешенные имена. И подозреваю, что теперь ему не нравятся имена obj-ов.

На VB не могу слинковать подменой, хотя на PureBasic либа ликуется, но правда там предусмотрен штатный механизм подключения статических библилтек.
Nonsense in BASIC. © 1982 ...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Линковка статической либы

Сообщение Хакер » 12.04.2012 (Чт) 20:19

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

Откуда вообще взялась эта lib-ка?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Линковка статической либы

Сообщение ger_kar » 12.04.2012 (Чт) 22:01

А вообще после того как стало ясно что линковка в VB, тема для меня стала жутко интересной. И тут я думаю не важно откуда либа, а важен метод, который можно взять на вооружение и линковать например ассемблерные процедуры зашитые в статическую либу.
Бороться и искать, найти и перепрятать

KiloGraf
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 142
Зарегистрирован: 21.10.2004 (Чт) 7:37
Откуда: берутся такие глупые вопросы?

Re: Линковка статической либы

Сообщение KiloGraf » 13.04.2012 (Пт) 8:30

Хакер писал(а):Откуда вообще взялась эта lib-ка?

Немного истории, и она достаточно старая...

Помнится мне, что была в свое время популярна тема с использованием продуктов немецкого умельца(ев)...
http://www.un4seen.com/
...но бесплатная лицензия не позволяла создавать "не серьезные продукты" и таскать с собой их DLL'ки. И тогда многие стали извращаться, как кто умеет.

Я был тоже заражен этой темой, и делал свой загрузчик. Вернее я пытался уже готовый загрузчик портировать с Delphi на VB.
http://rsdn.ru/article/baseserv/peloader.xml
Но из-за трудностей со знанием самого Delphi, я тогда бросил свою недоделку, и только недавно привел его в более-менее рабочее состояние. А тогда я действительно выбрал себе извращенный способ...
...разложил DLL'ку на секции и грузил ее части из ресурсов. Результат был получен - нет в памяти дополнительной динамически загруженной библиотеки!

Был еще один интересный проект с линковкой статической либы под VB, он и сейчас еще живет...
http://ufmod.sourceforge.net/
...там даже два примера есть с подменой.

По аналогии с ним я тогда тоже пытался экспериментировать, но тщетно... Брошенных заготовок было много...
...вот недавно вспомнил об одной из них, и захотелось "оживить" идею. Сама либа взялась отсюда:
http://www.1337haxorz.de/products.html
Но там уже более свежая версия (1.5), а я пытался линковать вариант попроще (1.0). Если нужно, то могу прикрепить атач.

И правильно выразился ger_kar:
ger_kar писал(а):...не важно откуда либа, а важен метод, который можно взять на вооружение и линковать например ассемблерные процедуры зашитые в статическую либу.

Важно научится. Найти и в VB способ линковать статические библиотеки, свои или сторонние. И приходится пока "выбирать себе способ извращенства", но таким образом расширять возможности VB, которых нас изначально лишили.
Nonsense in BASIC. © 1982 ...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Линковка статической либы

Сообщение ger_kar » 13.04.2012 (Пт) 10:21

В этой теме:
Хакер писал(а):А теперь сюрприз: VB поддерживает секцию VBCompiler в которой может быть два ключа:C2Switches — который определяет дополнительные ключи вызова компилятора (c2.exe)LinkSwitches — который опредеяет дополнительные ключи вызова линкера (link.exe)Ключи вызова линкера тоже не являются тайной, они все документированы, и в частности, документирован ключ /EXPORT:
Хакер писал(а):P.P.S. И конечно, использование этих двух ключей совсем не ограничивается экспортом произвольных имён.

Может в этом направлении покопать?
Бороться и искать, найти и перепрятать


Вернуться в С/С++

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList