<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Линковка в периоде исполнения (dlsym)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html</link>
    <description>Вообщем написал библиотеку, откомпилировал её так:&lt;br&gt;g++ -fPIC -c igate.cpp -o igate.o&lt;br&gt;g++ -shared -o libigate.so igate.o&lt;br&gt;В результате получил библиотеку:&lt;br&gt; libigate.so&lt;br&gt;Теперь пытаюсь её использовать:&lt;br&gt;1. сначало подгружаю её используя dlopen(libname, flags). Библиотека подгружается без &lt;br&gt;проблем никаких ошибок.&lt;br&gt;2. Но вот когда пытаю получить указатель функции, получаю ошибки, например:&lt;br&gt;после выполнения dlsym(hGate, &quot;httplookup&quot;) - dlerror возвращает: &quot;./libigate.so: undefined symbol httplookup&quot;. И такая проблема с любой функцией.&lt;br&gt;----------------------------------------------&lt;br&gt;Попробовал даже для проверки простенькую тестовую библиотеку написать:&lt;br&gt;типа:&lt;br&gt;1. testdl.cpp:&lt;br&gt; int tester(int i) &#123; return i; &#125;&lt;br&gt;2. g++ -fPIC -c testdl.cpp -o testdl.o&lt;br&gt;   g++ -shared -o libtestdl.so testdl.o&lt;br&gt;3. уже в программе:&lt;br&gt;hLib = dlopen(&quot;./libtestdl.so&quot;, RTLD_LAZY);&lt;br&gt;lpfnTester = dlsym(hLib, &quot;tester&quot;);&lt;br&gt;И опять та же фигня: ./libtestdl.so: undefined symbol tester&lt;br&gt;--------------------------------------------------&lt;br&gt;Как же </description>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#10</link>
    <pubDate>Tue, 08 Jan 2008 19:11:01 GMT</pubDate>
    <description>&amp;gt;Линкер ошибку не даст, и ничего не перепутает.&lt;br&gt;&lt;br&gt;Блажен кто верует ;)&lt;br&gt;&lt;br&gt;&amp;gt; Сишный компилятор не скомпиляет, т.к. стандарт запрещает перегрузку функций&lt;br&gt;&lt;br&gt;Ещё бы он знал что есть функция с таким же именем. Если в 1 файле, то он узнает. А если в разных, ещё как скомпилирует :)&lt;br&gt;&lt;br&gt;&amp;gt; плюсовый скомпиляет, но с замэнгленными именами &lt;br&gt;&lt;br&gt;C extern &quot;C&quot; -то?&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Alexander S. Salieff)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#9</link>
    <pubDate>Tue, 08 Jan 2008 00:44:00 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&quot;C&quot;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Надо ли всё? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Ты не сможешь написать так: &lt;br&gt;&amp;gt;int abs (inf) &lt;br&gt;&amp;gt;double abs (double) &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Потому что обе эти функции будут иметь одно имя. В лучшем случае &lt;br&gt;&amp;gt;линкер даст ошибку, в худшем - он их перепутает. &lt;br&gt;&lt;br&gt;Линкер ошибку не даст, и ничего не перепутает. Сишный компилятор не скомпиляет, т.к. стандарт запрещает перегрузку функций, плюсовый скомпиляет, но с замэнгленными именами вроде _Z3absd...&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#8</link>
    <pubDate>Mon, 07 Jan 2008 08:36:48 GMT</pubDate>
    <description>&amp;gt;Решил не создавать себе лишних проблем и просто обернул всё в extern &lt;br&gt;&amp;gt;&quot;C&quot;&lt;br&gt;&lt;br&gt;Надо ли всё?&lt;br&gt;&lt;br&gt;Ты не сможешь написать так:&lt;br&gt;int abs (inf)&lt;br&gt;double abs (double)&lt;br&gt;&lt;br&gt;Потому что обе эти функции будут иметь одно имя. В лучшем случае линкер даст ошибку, в худшем - он их перепутает.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Bave)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#7</link>
    <pubDate>Sun, 06 Jan 2008 20:32:41 GMT</pubDate>
    <description>Решил не создавать себе лишних проблем и просто обернул всё в extern &quot;C&quot;,&lt;br&gt;пространства имён убрал, а к именам функций просто префиксы добавил ig..., т.е. igFuncname.&lt;br&gt;Пока всё без глюков работает :) &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Аноним)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#6</link>
    <pubDate>Sun, 06 Jan 2008 17:16:05 GMT</pubDate>
    <description>&amp;gt;а нет ли какой-нибудь библиотеки? &lt;br&gt;&lt;br&gt;Наверняка нет. ПОтому что как сказали выше, схема именования имеет свойство менятся, обычно при большой смене версии.&lt;br&gt;&lt;br&gt;В любом случае, если делаешь плагин, число экспортируемых функций должно быть маленькое, и коллизии имён не произойдёт (namespace не нужен). Напиши &quot;С&quot; интерфейсные обёртки для всех экспортируемых методов.&lt;br&gt;&lt;br&gt;А если не плагин - то пусть компиляторы, линковщики и загрузчики парятся с этими искажёнными именами :)&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Michelnok)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#5</link>
    <pubDate>Sun, 06 Jan 2008 14:51:11 GMT</pubDate>
    <description>&amp;gt;придется вручную заниматься name-mangling&apos;ом&lt;br&gt;&lt;br&gt;Кстати, а нет ли какой-нибудь библиотеки?&lt;br&gt;Иначе говоря, не торчит ли наружу то что использует gcc для формирования имен?&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Alexander S. Salieff)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#4</link>
    <pubDate>Sat, 05 Jan 2008 17:34:00 GMT</pubDate>
    <description>&amp;gt;&amp;gt;объяви функцию tester как &lt;br&gt;&amp;gt;&amp;gt;extern &quot;C&quot; int tester(int i) &#123; return i; &#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Точно, заработало :) &lt;br&gt;&amp;gt;Есть ещё вопрос - А как быть с функциями, заключёнными в пространства &lt;br&gt;&amp;gt;имён. Или придётся отказаться от использования пространств имён? &lt;br&gt;&lt;br&gt;В dlsym имена функций совпадают с прототипными только в стабильном C-ABI (от этого при линковке с g++ ничего и не работает, пока extern &quot;C&quot; не скажешь). Если вы хотите использовать C++-ABI, вам придется вручную заниматься name-mangling&apos;ом, будете вместо basic_ios::char_traits::eof вычислять конструкции вида _ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv&#064;&#064;GLIBCXX_3.4. Плюс ко всему команда gcc периодически ломает C++-ABI от версии к версии. Вследствие этих причин обычно используют C-ABI.&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Volody)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#3</link>
    <pubDate>Sat, 05 Jan 2008 07:03:36 GMT</pubDate>
    <description>многое определяеться практическим методом - попробуй. В моей практике не было необходимости использовать пространства имен, но теоретически проблем не должно быть.&lt;br&gt;</description>
</item>

<item>
    <title>Линковка в периоде исполнения (dlsym) (Bave)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/7082.html#2</link>
    <pubDate>Fri, 04 Jan 2008 17:44:24 GMT</pubDate>
    <description>&amp;gt;объяви функцию tester как &lt;br&gt;&amp;gt;extern &quot;C&quot; int tester(int i) &#123; return i; &#125; &lt;br&gt;&lt;br&gt;Точно, заработало :)&lt;br&gt;Есть ещё вопрос - А как быть с функциями, заключёнными в пространства имён. Или придётся отказаться от использования пространств имён? &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
