Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Runtime relative link with dll, Mingw gcc '-Wl,-rpath' 
:(
    Опции темы
alexx83
  Дата 26.10.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.3.2010

Репутация: нет
Всего: 1



Имеем windows + mingw. Есть dll, путь к которой не должен добавляться в PATH. Есть программа которую нужно слинковать с этой dll. Библиотека будет находиться относительно программы как показано на диаграмме:
 
ORIGIN
  |- bin
  |   \-program.exe
  |- opt
  |   |-lib
  |   |   \-mylib.dll


Есть ли возможность слинковать программу чтобы она сама искала необходимую dll по относительному пути?
Я пробовал вариант с передачей в LDFLAGS параметров
  Wl,-rpath,'../opt/lib' -L/path/to/lib -lmylib
Но скомпилированная программа не ищет по относительному пути.
PM MAIL   Вверх
kosmonaFFFt
Дата 26.10.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



В голову пришел только вариант с динамической подгрузкой через LoadLibrary в программе, без явной линковки программы с dll...


--------------------
user posted image
PM MAIL ICQ   Вверх
boostcoder
Дата 26.10.2012, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 2
Всего: 110



похоже, '-Wl,-rpath' в мингв не правильно работает. или же это особенность вендус...
спроси лучше в списке рассылки mingw, к примеру. они-то точно знают.

PM WWW   Вверх
bems
Дата 3.11.2012, 05:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



а что, в секции импорта РЕ-файла допустимо что-то кроме имени экспортирующего модуля? насколько я понимаю как бы линкер не хотел указать расположение дллки, но если он хочет создать корректный модуль, то ему придется записать туда только имя


--------------------
Обижено школьников: 8
PM MAIL   Вверх
leniviy
Дата 8.11.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Аналог rpath под виндой - манифест.

Например, wget.exe из порта unix utils зависит от libeay32.dll . Но мы не хотим класть libeay32.dll в %Path%, чтобы не было dll hell.
Для этого надо убрать из .exe файла встроенный манифест и написать свой.

расположение файлов:
Код

wget.exe
wget.exe.manifest
SomeDlls/libeay32.dll
SomeDlls/SomeDlls.manifest


wget.exe.manifest:
Код

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='SomeDlls' version='1.0.0.0' processorArchitecture='x86' />
    </dependentAssembly>
  </dependency>
</assembly>


SomeDlls/SomeDlls.manifest:
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity type="win32" name="SomeDlls" version="1.0.0.0" processorArchitecture="x86" />
    <file name="libeay32.dll" /> 
</assembly>


PM MAIL   Вверх
boostcoder
Дата 8.11.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 2
Всего: 110



Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
надо убрать из .exe файла встроенный манифест

это как?

Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
и написать свой.

и это как?

PM WWW   Вверх
leniviy
Дата 8.11.2012, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Цитата(alexx83 @  26.10.2012,  10:28 Найти цитируемый пост)
ORIGIN
  |- bin
  |   \-program.exe
  |- opt
  |   |-lib
  |   |   \-mylib.dll


не труЪ. В cygwin и mingw dll файлы традиционно кладут в bin/

Добавлено через 3 минуты и 21 секунду
Цитата(boostcoder @  8.11.2012,  12:03 Найти цитируемый пост)
Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
надо убрать из .exe файла встроенный манифест

это как?

1) Если .exe файл запакован upx - распаковать
2) Открыть в редакторе ресурсов, например, visual studio, и удалить.

Цитата(boostcoder @  8.11.2012,  12:03 Найти цитируемый пост)

Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
и написать свой.

и это как?

пример выше
PM MAIL   Вверх
leniviy
Дата 8.11.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



upd: чтобы винда искала манифест не в текущей директории, надо правильно обозвать этот ассембли: 

bin/program.exe.manifest:
<assemblyIdentity type='win32' name='..\opt\lib\lib' ...

opt/lib/lib.manifest:
<assemblyIdentity type="win32" name='..\opt\lib\lib'

обратите внимание, что имена совпадают. Проверил на win7

Добавлено @ 12:24
upd2: при тестировании надо всё время переименовывать папку, так как винда кэширует фейлы.

Это сообщение отредактировал(а) leniviy - 8.11.2012, 13:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | GNU toolchain | Следующая тема »


 




[ Время генерации скрипта: 0.1225 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.