<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Getting SO&#39;s to compile and load properly</title>
		<link>http://www.allegro.cc/forums/view/585627</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 27 May 2006 03:33:27 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In another thread I mentioned my Sudoku game. I&#39;m trying to get it to work in Linux. After some lengthy effort I&#39;m getting some errors. In the game. generator.so is loaded, but I can&#39;t extract the functions.</p><p>After some work, I&#39;ve made a simple test program and can&#39;t get the so to load.</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// yeah.cpp</span>
<span class="p">#include &lt;stdio.h&gt;</span>

<span class="k1">int</span> p <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>

<span class="k1">int</span> yeah<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span> <span class="s">"%d\n"</span>, <span class="k3">+</span><span class="k3">+</span>p <span class="k2">)</span><span class="k2">;</span> 
    
    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Compiled with:<br />g++ -o yeah.so -shared -fPIC yeah.cpp</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">// main.cpp</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;dlfcn.h&gt;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">int</span> main<span class="k2">(</span> <span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv <span class="k2">)</span></td></tr><tr><td class="number">7</td><td><span class="k2">{</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">int</span> rt <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <span class="k1">const</span> <span class="k1">char</span> modName<span class="k2">[</span> <span class="n">40</span> <span class="k2">]</span> <span class="k3">=</span> <span class="s">"yeah.so"</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">void</span> <span class="k3">*</span>library <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    <span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span>yeah<span class="k2">)</span><span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>    </td></tr><tr><td class="number">14</td><td>    <span class="k1">if</span> <span class="k2">(</span> <span class="k3">!</span><span class="k2">(</span> library <span class="k3">=</span> dlopen<span class="k2">(</span> modName, RTLD_LAZY<span class="k2">)</span> <span class="k2">)</span> <span class="k2">)</span></td></tr><tr><td class="number">15</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span> <span class="s">"Could not load: %s\n"</span>, modName <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>        <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>    yeah <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span> <span class="k2">(</span><span class="k3">*</span><span class="k2">)</span><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>dlsym<span class="k2">(</span> library, <span class="s">"yeah"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    </td></tr><tr><td class="number">22</td><td>    <span class="k1">if</span> <span class="k2">(</span> <span class="k3">!</span>yeah <span class="k2">)</span></td></tr><tr><td class="number">23</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">24</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span> <span class="s">"Could not extract function\n"</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>        <span class="k1">return</span> <span class="k3">-</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>    <span class="k1">for</span> <span class="k2">(</span> <span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">5</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span></td></tr><tr><td class="number">29</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">30</td><td>        yeah<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">32</td><td>    </td></tr><tr><td class="number">33</td><td>    dlclose<span class="k2">(</span>library<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    </td></tr><tr><td class="number">35</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Compiled with:<br />g++ -o main main.cpp -ldl</p><p>yeah.so and main are created with permissions 777. But when main is ran as <br />./main, I get the &#39;Could not load: yeah.so&#39;</p><p>So, what am I doing wrong? Any suggestions to help me.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Sat, 27 May 2006 00:58:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Set your LDPATH (or was it LD_PATH?) to point to the directory where the .so file is. Otherwise, add it to /etc/ld.so.conf (or something similar) and run ldconfig. Or run <i>ldconfig <i>dir/where/so/is</i> to temporarily add it to your linker path.</i>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sat, 27 May 2006 01:07:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, use absolute paths! For example:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> soName<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">"yeah.so"</span>
<span class="k1">char</span> fullName<span class="k2">[</span>MAX_PATH<span class="k2">]</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/replace_filename" target="_blank"><span class="a">replace_filename</span></a><span class="k2">(</span>fullName, argv<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, soName, MAX_PATH<span class="k2">)</span><span class="k2">;</span>
...
</pre></div></div><p>
ReyBrujo: That&#39;s for dynamically loading plugins!</p><p>EDIT: Hmm, still doesn&#39;t work. Interesting, because I use very similar code and it works... <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (miran)</author>
		<pubDate>Sat, 27 May 2006 01:24:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh, you are right. With the full path it loads the library but can&#39;t get the handle to the function.</p><p>(Edited: Got it working. The problem is that the function name is mangled in C++, thus you can&#39;t just load <i>yeah</i>, but instead <i>_Z4yeahv</i> (in my case). Some magic with <i>extern &quot;C&quot;</i> should make it work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sat, 27 May 2006 01:37:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Set your LDPATH (or was it LD_PATH?)
</p></div></div><p>
LD_LIBRARY_PATH
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Sat, 27 May 2006 01:38:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh I forgot he didn&#39;t have <tt>extern &quot;C&quot;</tt>.</p><p>So, final solution:</p><p>1. extern &quot;C&quot; in front of the functions you export<br />2. load .so with full path
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (miran)</author>
		<pubDate>Sat, 27 May 2006 01:48:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok I did that and the program runs fine. It wasn&#39;t loading the text correctly, but I fixed that also. I just need to compile it statically and add it to the download page.</p><p>Thanks Guys
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (DanielH)</author>
		<pubDate>Sat, 27 May 2006 03:33:27 +0000</pubDate>
	</item>
</rss>
