【C言語】静的リンクする方法
このコミットが含まれているのは:
コミット
476f26d74c
279
gemini/blog.atom
279
gemini/blog.atom
|
@ -3,13 +3,214 @@
|
|||
<id>gemini://technicalsuwako.moe</id>
|
||||
<title>テクニカル諏訪子</title>
|
||||
|
||||
<updated>2024-04-10T12:00:00Z</updated>
|
||||
<updated>2024-04-16T00:00:00Z</updated>
|
||||
|
||||
<author><name>テクニカル諏訪子</name></author>
|
||||
<link href="gemini://technicalsuwako.moe" rel="alternate"></link>
|
||||
|
||||
|
||||
|
||||
<entry>
|
||||
<id>blog/c-static-link.gmi</id>
|
||||
<author><name>凛</name></author>
|
||||
<title type="html">【C言語】静的リンクする方法</title>
|
||||
<published>2024-04-16T00:00:00Z</published>
|
||||
|
||||
<category term="jp"></category>
|
||||
|
||||
<category term="blog"></category>
|
||||
|
||||
<category term="c言語"></category>
|
||||
|
||||
<category term="c++"></category>
|
||||
|
||||
<category term="openbsd"></category>
|
||||
|
||||
<category term="freebsd"></category>
|
||||
|
||||
<category term="netbsd"></category>
|
||||
|
||||
<category term="linux"></category>
|
||||
|
||||
<category term="プログラミング"></category>
|
||||
|
||||
<link href="gemini://technicalsuwako.moe/blog/c-static-link.gmi" rel="alternate"></link>
|
||||
<content type="html">
|
||||
|
||||
|
||||
|
||||
<h2 id="heading">注意点</h2>
|
||||
<p>もし貴方のLinuxディストリビューションがglibcライブラリを使用している場合、この投稿は恐らく動作しません。<br />
|
||||
muslを使用したLinuxディストリビューションか、BSD OSをご検討下さい。<br />
|
||||
muslを使用した人気のあるLinuxディストリビューションには、Void Linux、Gentoo、Alpine Linuxがあります。</p>
|
||||
<h2 id="c">C言語でのソフトを静的リンクは可能!?</h2>
|
||||
<p>はい、可能です。<br />
|
||||
前述の通り、glibcでは恐らく不可能です。<br />
|
||||
しかし、muslを使用したLinuxディストリビューションで静的リンクを行うと、glibcを使用したLinuxディストリビューションでも実行出来るという事です。<br />
|
||||
必要なのは、リンクする全てのライブラリの 「.a」 バージョンです。<br />
|
||||
コンパイルするコマンドは、動的リンクとは非常に異なる見た目になります。<br />
|
||||
例として、自分の「sp」を取り上げましょう。</p>
|
||||
<p>動的リンクでは、コマンドは次の様になります:</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>cc -L/usr/local/lib -I/usr/local/include -o sp *.c -lgpgme -lassuan
|
||||
</span></span></code></pre><p>しかし、静的リンクでは、このコマンドは次の様になります(OpenBSDの場合):</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>cc -L/usr/local/lib -I/usr/local/include -o sp *.c -static -lgpgme -lcrypto -lc -lassuan -lgpg-error -lthr -lintl
|
||||
</span></span></code></pre><h2 id="heading-1">必要なライブラリを受取方</h2>
|
||||
<p>どのライブラリをリンクする必要があるかを知るには、まず動的リンクされたバイナリをコンパイルする必要があります。<br />
|
||||
その後、<code lang="">ldd</code> コマンドを使用して必要なライブラリを調べる事が出来ます。</p>
|
||||
<h3 id="openbsd">OpenBSD</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>sp:
|
||||
</span></span><span style="display:flex;"><span> Start End Type Open Ref GrpRef Name
|
||||
</span></span><span style="display:flex;"><span> 00000664e28c2000 00000664e28cd000 exe <span style="color:#666">1</span> <span style="color:#666">0</span> <span style="color:#666">0</span> sp
|
||||
</span></span><span style="display:flex;"><span> 000006678e2b6000 000006678e317000 rlib <span style="color:#666">0</span> <span style="color:#666">1</span> <span style="color:#666">0</span> /usr/local/lib/libgpgme.so.24.2
|
||||
</span></span><span style="display:flex;"><span> 00000666f3610000 00000666f3824000 rlib <span style="color:#666">0</span> <span style="color:#666">1</span> <span style="color:#666">0</span> /usr/lib/libcrypto.so.53.0
|
||||
</span></span><span style="display:flex;"><span> 000006672dfe7000 000006672e0de000 rlib <span style="color:#666">0</span> <span style="color:#666">1</span> <span style="color:#666">0</span> /usr/lib/libc.so.99.0
|
||||
</span></span><span style="display:flex;"><span> 000006670aadd000 000006670aaf5000 rlib <span style="color:#666">0</span> <span style="color:#666">1</span> <span style="color:#666">0</span> /usr/local/lib/libassuan.so.2.1
|
||||
</span></span><span style="display:flex;"><span> 000006670b08d000 000006670b0b7000 rlib <span style="color:#666">0</span> <span style="color:#666">2</span> <span style="color:#666">0</span> /usr/local/lib/libgpg-error.so.3.26
|
||||
</span></span><span style="display:flex;"><span> 0000066744e3e000 0000066744e62000 rlib <span style="color:#666">0</span> <span style="color:#666">3</span> <span style="color:#666">0</span> /usr/local/lib/libintl.so.8.0
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">0000066705496000</span> 00000667055a8000 rlib <span style="color:#666">0</span> <span style="color:#666">4</span> <span style="color:#666">0</span> /usr/local/lib/libiconv.so.7.1
|
||||
</span></span><span style="display:flex;"><span> 00000667c6522000 00000667c6522000 ld.so <span style="color:#666">0</span> <span style="color:#666">1</span> <span style="color:#666">0</span> /usr/libexec/ld.so
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB shared object, x86-64, version <span style="color:#666">1</span>
|
||||
</span></span></code></pre><h3 id="freebsd">FreeBSD</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp:
|
||||
</span></span><span style="display:flex;"><span> libgpgme.so.43 <span style="color:#666">=</span>&gt; /usr/local/lib/libgpgme.so.43 <span style="color:#666">(</span>0x15272fd71000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libcrypto.so.30 <span style="color:#666">=</span>&gt; /lib/libcrypto.so.30 <span style="color:#666">(</span>0x15272e58e000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libc.so.7 <span style="color:#666">=</span>&gt; /lib/libc.so.7 <span style="color:#666">(</span>0x15273063b000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libassuan.so.8 <span style="color:#666">=</span>&gt; /usr/local/lib/libassuan.so.8 <span style="color:#666">(</span>0x15272ee04000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libgpg-error.so.0 <span style="color:#666">=</span>&gt; /usr/local/lib/libgpg-error.so.0 <span style="color:#666">(</span>0x152731580000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libthr.so.3 <span style="color:#666">=</span>&gt; /lib/libthr.so.3 <span style="color:#666">(</span>0x1527317bb000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libintl.so.8 <span style="color:#666">=</span>&gt; /usr/local/lib/libintl.so.8 <span style="color:#666">(</span>0x15273205b000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> <span style="color:#666">[</span>vdso<span style="color:#666">]</span> <span style="color:#666">(</span>0x15272e207000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>FreeBSD<span style="color:#666">)</span>, dynamically linked, interpreter /libexec/ld-elf.so.1, <span style="color:#a2f;font-weight:bold">for</span> FreeBSD 14.0 <span style="color:#666">(</span>1400097<span style="color:#666">)</span>, FreeBSD-style, stripped
|
||||
</span></span></code></pre><h3 id="netbsd">NetBSD</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ <span style="color:#a2f">export</span> <span style="color:#b8860b">LD_LIBRARY_PATH</span><span style="color:#666">=</span>/usr/pkg/lib:<span style="color:#b8860b">$LD_LIBRARY_PATH</span>
|
||||
</span></span><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp:
|
||||
</span></span><span style="display:flex;"><span> -lgpgme.11 <span style="color:#666">=</span>&gt; /usr/pkg/lib/libgpgme.so.11
|
||||
</span></span><span style="display:flex;"><span> -lassuan.0 <span style="color:#666">=</span>&gt; /usr/pkg/lib/libassuan.so.0
|
||||
</span></span><span style="display:flex;"><span> -lgpg-error.0 <span style="color:#666">=</span>&gt; /usr/pkg/lib/libgpg-error.so.0
|
||||
</span></span><span style="display:flex;"><span> -lintl.1 <span style="color:#666">=</span>&gt; /usr/lib/libintl.so.1
|
||||
</span></span><span style="display:flex;"><span> -lc.12 <span style="color:#666">=</span>&gt; /usr/lib/libc.so.12
|
||||
</span></span><span style="display:flex;"><span> -lcrypto.15 <span style="color:#666">=</span>&gt; /usr/lib/libcrypto.so.15
|
||||
</span></span><span style="display:flex;"><span> -lcrypt.1 <span style="color:#666">=</span>&gt; /lib/libcrypt.so.1
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>SYSV<span style="color:#666">)</span>, dynamically linked, interpreter /usr/libexec/ld.elf_so, <span style="color:#a2f;font-weight:bold">for</span> NetBSD 10.0, stripped
|
||||
</span></span></code></pre><h3 id="void-linux">Void Linux</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span> /lib/ld-musl-x86_64.so.1 <span style="color:#666">(</span>0x7f7689c5a000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libgpgme.so.11 <span style="color:#666">=</span>&gt; /lib/libgpgme.so.11 <span style="color:#666">(</span>0x7f7689bfb000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libcrypto.so.3 <span style="color:#666">=</span>&gt; /lib/libcrypto.so.3 <span style="color:#666">(</span>0x7f7689600000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libc.so <span style="color:#666">=</span>&gt; /lib/ld-musl-x86_64.so.1 <span style="color:#666">(</span>0x7f7689c5a000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libassuan.so.0 <span style="color:#666">=</span>&gt; /lib/libassuan.so.0 <span style="color:#666">(</span>0x7f7689be6000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span> libgpg-error.so.0 <span style="color:#666">=</span>&gt; /lib/libgpg-error.so.0 <span style="color:#666">(</span>0x7f7689bbe000<span style="color:#666">)</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB pie executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>SYSV<span style="color:#666">)</span>, dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, BuildID<span style="color:#666">[</span>sha1<span style="color:#666">]=()</span>, stripped
|
||||
</span></span></code></pre><h2 id="heading-2">必要なライブラリをインストールする方法</h2>
|
||||
<p>OpenBSDとNetBSDでは、リポジトリからgpgmeのみをインストールすると、必要な全ての「.a」ファイルが既に入手出来ます。<br />
|
||||
流石ね、OppaiBSDとNyuuBSD!</p>
|
||||
<p>FreeBSDとVoid Linuxでは、libassuan.a と libgpgme.a のみが不足しています。<br />
|
||||
特にVoid Linuxでは、libgpg-error.a も不足しています。</p>
|
||||
<p>しかし、ソースからコンパイルすれば簡単に取得出来るという事です。<br />
|
||||
それではやってみましょう!<br />
|
||||
手順はFreeBSDとVoid Linuxの両方で有効ですので、コマンドは1度だけ提供します。</p>
|
||||
<h3 id="libgpgme-error">libgpgme-error</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>wget https://www.gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.48.tar.gz
|
||||
</span></span><span style="display:flex;"><span>tar zxfv libgpg-error-1.48.tar.gz
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> libgpg-error-1.48
|
||||
</span></span><span style="display:flex;"><span>./configure --enable-static
|
||||
</span></span><span style="display:flex;"><span>make
|
||||
</span></span><span style="display:flex;"><span>doas make install
|
||||
</span></span></code></pre><p>Void Linuxのみ:</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas mv /usr/local/lib/libgpg-error.a /usr/lib
|
||||
</span></span><span style="display:flex;"><span>doas mv /usr/local/lib/libgpg-error.la /usr/lib
|
||||
</span></span></code></pre><h3 id="libassuan">libassuan</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>wget https://www.gnupg.org/ftp/gcrypt/libassuan/libassuan-2.5.7.tar.bz2
|
||||
</span></span><span style="display:flex;"><span>bsdtar -xvf libassuan-2.5.7.tar.bz2
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> libassuan-2.5.7
|
||||
</span></span><span style="display:flex;"><span>./configure --enable-static
|
||||
</span></span><span style="display:flex;"><span>make
|
||||
</span></span><span style="display:flex;"><span>doas make install
|
||||
</span></span></code></pre><p>Void Linuxのみ:</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas mv /usr/local/lib/libassuan.a /usr/lib
|
||||
</span></span><span style="display:flex;"><span>doas mv /usr/local/lib/libassuan.la /usr/lib
|
||||
</span></span></code></pre><h3 id="libgpgme">libgpgme</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>wget https://www.gnupg.org/ftp/gcrypt/gpgme/gpgme-1.23.2.tar.bz2
|
||||
</span></span><span style="display:flex;"><span>bsdtar -xvf gpgme-1.23.2.tar.bz2
|
||||
</span></span><span style="display:flex;"><span>cd gpgme-1.23.2
|
||||
</span></span><span style="display:flex;"><span>./autogen.sh
|
||||
</span></span><span style="display:flex;"><span>mkdir build &amp;&amp; cd build
|
||||
</span></span><span style="display:flex;"><span>../configure --enable-maintainer-mode --enable-static
|
||||
</span></span><span style="display:flex;"><span>make
|
||||
</span></span><span style="display:flex;"><span>doas make install
|
||||
</span></span></code></pre><p>Void Linuxのみ:</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas mv /usr/local/lib/libgpgme.a /usr/lib
|
||||
</span></span><span style="display:flex;"><span>doas mv /usr/local/lib/libgpgme.la /usr/lib
|
||||
</span></span><span style="display:flex;"><span>doas mv /usr/local/lib/libgpgmepp.a /usr/lib
|
||||
</span></span><span style="display:flex;"><span>doas mv /usr/local/lib/libgpgmepp.la /usr/lib
|
||||
</span></span></code></pre><p>必要な全ての「.a」ファイルを取得したら、この投稿の冒頭で提供したコマンドを使用してコンパイルを開始出来ます。</p>
|
||||
<h2 id="heading-3">結果</h2>
|
||||
<h3 id="openbsd-1">OpenBSD</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp:
|
||||
</span></span><span style="display:flex;"><span> Start End Type Open Ref GrpRef Name
|
||||
</span></span><span style="display:flex;"><span> 00000a9c31dc9000 00000a9c32131000 dlib <span style="color:#666">1</span> <span style="color:#666">0</span> <span style="color:#666">0</span> /home/suwako/dev/finish/sp/sp
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB shared object, x86-64, version <span style="color:#666">1</span>
|
||||
</span></span></code></pre><h3 id="freebsd-1">FreeBSD</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>ldd: ./sp: not a dynamic ELF executable
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>FreeBSD<span style="color:#666">)</span>, statically linked, <span style="color:#a2f;font-weight:bold">for</span> FreeBSD 14.0 <span style="color:#666">(</span>1400097<span style="color:#666">)</span>, FreeBSD-style, stripped
|
||||
</span></span></code></pre><h3 id="netbsd-1">NetBSD</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ <span style="color:#a2f">export</span> <span style="color:#b8860b">LD_LIBRARY_PATH</span><span style="color:#666">=</span>/usr/pkg/lib:<span style="color:#b8860b">$LD_LIBRARY_PATH</span>
|
||||
</span></span><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>ldd: /home/suwako/dev/finish/sp/./sp-: invalid ELF class 2; expected <span style="color:#666">1</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>SYSV<span style="color:#666">)</span>, statically linked, <span style="color:#a2f;font-weight:bold">for</span> NetBSD 10.0, stripped
|
||||
</span></span></code></pre><h3 id="void-linux-1">Void Linux</h3>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ ldd ./sp
|
||||
</span></span><span style="display:flex;"><span>ldd: ./sp: Not a valid dynamic program
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ file ./sp
|
||||
</span></span><span style="display:flex;"><span>./sp: ELF 64-bit LSB executable, x86-64, version <span style="color:#666">1</span> <span style="color:#666">(</span>SYSV<span style="color:#666">)</span>, statically linked, BuildID<span style="color:#666">[</span>sha1<span style="color:#666">]=()</span>, stripped
|
||||
</span></span></code></pre><h2 id="heading-4">ファイルサイズが大き過ぎ!!</h2>
|
||||
<p>静的リンクを行うと、必要な全てのコードがバイナリに含まれる為、再コンパイルする必要なしに異なるコンピュータに単一のバイナリをコピー出来ます。<br />
|
||||
その為、バイナリのサイズは、動的リンクされたバイナリよりもかなり大きくなります。<br />
|
||||
動的リンクされたバイナリはシステム上のどこかにある「.so」ファイルを指すだけであり、システム間で異なる可能性があり、更に使用されているバージョンが異なる可能性がある為、バイナリは全く移植性がありません。<br />
|
||||
ローリングリリースのLinuxディストリビューションを使用している方は、ある時点で自分のプログラムが突然機能しなくなった経験があるかもしれません。<br />
|
||||
これは、「.so」ファイルが新しいバージョンに更新された為に発生しますが、プログラム自体は未だ同じバイナリです。<br />
|
||||
これがあたしが静的リンクを好む理由です!</p>
|
||||
<p>但し、コンパイル後に単純に <code lang="">strip</code> コマンドを使用する事で、バイナリサイズを大幅に削減できます。<br />
|
||||
警告に気にしないで下さい。これはGNUの開発者の問題です(彼らはlibassuanとgpgmeを作成しました)。<br />
|
||||
あたしの「sp」プログラムは100%のコードが正しいです。</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>$ cc -Wall -Wextra -O3 -I/usr/local/include -L/usr/local/lib -o sp *.c -static -lgpgme -lcrypto -lc -lassuan -lgpg-error -lintl -liconv
|
||||
</span></span><span style="display:flex;"><span>engine-assuan.c<span style="color:#666">(</span>engine-assuan.o:<span style="color:#666">(</span>llass_set_engine_flags<span style="color:#666">)</span> in archive /usr/local/lib/libgpgme.a<span style="color:#666">)</span>: warning: strcpy<span style="color:#666">()</span> is almost always misused, please use strlcpy<span style="color:#666">()</span>
|
||||
</span></span><span style="display:flex;"><span>stringutils.c:107<span style="color:#666">(</span>libgpg_error_la-stringutils.o:<span style="color:#666">(</span>_gpgrt_vfnameconcat<span style="color:#666">)</span> in archive /usr/local/lib/libgpg-error.a<span style="color:#666">)</span>: warning: stpcpy<span style="color:#666">()</span> is dangerous; <span style="color:#a2f;font-weight:bold">do</span> not use it
|
||||
</span></span><span style="display:flex;"><span>estream-printf.c:1114<span style="color:#666">(</span>libgpg_error_la-estream-printf.o:<span style="color:#666">(</span>do_format<span style="color:#666">)</span> in archive /usr/local/lib/libgpg-error.a<span style="color:#666">)</span>: warning: sprintf<span style="color:#666">()</span> is often misused, please use snprintf<span style="color:#666">()</span>
|
||||
</span></span><span style="display:flex;"><span>assuan-handler.c<span style="color:#666">(</span>libassuan_la-assuan-handler.o:<span style="color:#666">(</span>assuan_write_status<span style="color:#666">)</span> in archive /usr/local/lib/libassuan.a<span style="color:#666">)</span>: warning: strcat<span style="color:#666">()</span> is almost always misused, please use strlcat<span style="color:#666">()</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ ls -thal sp
|
||||
</span></span><span style="display:flex;"><span>-rwxr-xr-x <span style="color:#666">1</span> suwako suwako 8.9M Apr <span style="color:#666">16</span> 14:37 sp
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span>$ strip sp
|
||||
</span></span><span style="display:flex;"><span>$ ls -thal sp
|
||||
</span></span><span style="display:flex;"><span>-rwxr-xr-x <span style="color:#666">1</span> suwako suwako 3.4M Apr <span style="color:#666">16</span> 14:39 sp
|
||||
</span></span></code></pre><p>以上</p>
|
||||
|
||||
|
||||
</content>
|
||||
</entry>
|
||||
|
||||
<entry>
|
||||
<id>blog/hozonsite-130.gmi</id>
|
||||
<author><name>凛</name></author>
|
||||
|
@ -228,81 +429,5 @@ ThinkPad X250にOpenIndianaをインストールしましたが、新しくイ
|
|||
</content>
|
||||
</entry>
|
||||
|
||||
<entry>
|
||||
<id>blog/openbsd-compile-monero-btop.gmi</id>
|
||||
<author><name>凜</name></author>
|
||||
<title type="html">【OpenBSD】Moneroウォレットとbtopのコンパイル方法</title>
|
||||
<published>2024-04-01T00:00:00Z</published>
|
||||
|
||||
<category term="jp"></category>
|
||||
|
||||
<category term="blog"></category>
|
||||
|
||||
<category term="openbsd"></category>
|
||||
|
||||
<category term="linux"></category>
|
||||
|
||||
<category term="freebsd"></category>
|
||||
|
||||
<category term="monero"></category>
|
||||
|
||||
<category term="モネロ"></category>
|
||||
|
||||
<category term="netbsd"></category>
|
||||
|
||||
<link href="gemini://technicalsuwako.moe/blog/openbsd-compile-monero-btop.gmi" rel="alternate"></link>
|
||||
<content type="html">
|
||||
|
||||
|
||||
|
||||
<h2 id="monero-cli-">Monero CLI ウォレットのコンパイル方法</h2>
|
||||
<p><a href="/blog/crypto-1-monero-dero-wallet.xhtml">前回は「ウォレットの選択」で「OpenBSDの場合は全くありません。」と述べましたが、それは誤りでした。</a>
|
||||
それじゃ、コンパイルしてみましょう!</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas pkg_add cmake gmake zeromq libiconv boost libunbound
|
||||
</span></span><span style="display:flex;"><span>mkdir -p ~/.local/src
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> ~/.local/src
|
||||
</span></span><span style="display:flex;"><span>git clone https://github.com/monero-project/monero.git
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> monero
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">ulimit</span> -d <span style="color:#666">2000000</span>
|
||||
</span></span><span style="display:flex;"><span>git submodule update --init --force
|
||||
</span></span><span style="display:flex;"><span>gmake
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> build/OpenBSD/master/release/bin
|
||||
</span></span><span style="display:flex;"><span>doas cp monero* /usr/local/bin
|
||||
</span></span></code></pre><h2 id="btop">btopのコンパイル方法</h2>
|
||||
<p>そして、あたしのお気に入りのシステムモニターであるbtopもコンパイルします。</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas pkg_add cmake g++%11 git ninja lowdown
|
||||
</span></span><span style="display:flex;"><span>mkdir -p ~/.local/src
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> ~/.local/src
|
||||
</span></span><span style="display:flex;"><span>git clone https://github.com/aristocratos/btop.git
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> btop
|
||||
</span></span><span style="display:flex;"><span><span style="color:#b8860b">CXX</span><span style="color:#666">=</span>eg++ cmake -B build -G Ninja
|
||||
</span></span><span style="display:flex;"><span>cmake --build build
|
||||
</span></span><span style="display:flex;"><span>doas cmake --install build
|
||||
</span></span></code></pre><p><img src="https://ass.technicalsuwako.moe/2024-04-01-205103_1280x800_scrot.png" alt="" /></p>
|
||||
<h2 id="freebsd">FreeBSDは?</h2>
|
||||
<p>FreeBSDの場合は、「pkg」で簡単にインストール出来ます。</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas pkg install monero-cli btop
|
||||
</span></span></code></pre><p><img src="https://ass.technicalsuwako.moe/2024-04-01-205146_1920x1080_scrot.png" alt="" /></p>
|
||||
<h2 id="netbsd">NetBSDは?</h2>
|
||||
<p>残念ながら、Moneroウォレットもbtopもコンパイル出来ませんでした・・・</p>
|
||||
<h2 id="crux">CRUXは?</h2>
|
||||
<p>両方とも「suwaports」というコレクションに含まれています。</p>
|
||||
<pre style="background-color:#f8f8f8;; overflow-x: auto"><code lang=""><span style="display:flex;"><span>doas su
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> /etc/ports
|
||||
</span></span><span style="display:flex;"><span>wget https://076.moe/repo/crux/suwaports.httpup
|
||||
</span></span><span style="display:flex;"><span>ports -u
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> /usr/ports/suwaports/monero
|
||||
</span></span><span style="display:flex;"><span>pkgmk -d
|
||||
</span></span><span style="display:flex;"><span>pkgadd monero#0.18.3.1-1.pkg.tar.gz
|
||||
</span></span><span style="display:flex;"><span><span style="color:#a2f">cd</span> ../btop
|
||||
</span></span><span style="display:flex;"><span>pkgmk -d
|
||||
</span></span><span style="display:flex;"><span>pkgadd btop#1.2.13-1.pkg.tar.gz
|
||||
</span></span></code></pre><p><img src="https://ass.technicalsuwako.moe/2024-04-01-210229_1440x900_scrot.png" alt="" /></p>
|
||||
<p>以上</p>
|
||||
|
||||
|
||||
</content>
|
||||
</entry>
|
||||
|
||||
|
||||
</feed>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
# 記事一覧
|
||||
|
||||
=> /blog/c-static-link.gmi 2024年04月16日 【C言語】静的リンクする方法
|
||||
=> /blog/digital-autonomy-linux-to-openbsd.gmi 2024年04月10日 【デジタル自主】LinuxからOpenBSDに乗り換えた理由
|
||||
=> /blog/hozonsite-120.gmi 2024年04月08日 【076】保存サイト 1.2.0登場
|
||||
=> /blog/mivfx-040.gmi 2024年04月07日 【076】mivfx 0.4.0登場
|
||||
|
|
|
@ -0,0 +1,233 @@
|
|||
=> /blog.gmi ブログ一覧へ
|
||||
|
||||
#【C言語】静的リンクする方法
|
||||
投稿日:2024-04-16
|
||||
|
||||
## 注意点
|
||||
もし貴方のLinuxディストリビューションがglibcライブラリを使用している場合、この投稿は恐らく動作しません。
|
||||
muslを使用したLinuxディストリビューションか、BSD OSをご検討下さい。
|
||||
muslを使用した人気のあるLinuxディストリビューションには、Void Linux、Gentoo、Alpine Linuxがあります。
|
||||
|
||||
## C言語でのソフトを静的リンクは可能!?
|
||||
はい、可能です。
|
||||
前述の通り、glibcでは恐らく不可能です。
|
||||
しかし、muslを使用したLinuxディストリビューションで静的リンクを行うと、glibcを使用したLinuxディストリビューションでも実行出来るという事です。
|
||||
必要なのは、リンクする全てのライブラリの 「.a」 バージョンです。
|
||||
コンパイルするコマンドは、動的リンクとは非常に異なる見た目になります。
|
||||
例として、自分の「sp」を取り上げましょう。
|
||||
|
||||
動的リンクでは、コマンドは次の様になります:
|
||||
```sh
|
||||
cc -L/usr/local/lib -I/usr/local/include -o sp *.c -lgpgme -lassuan
|
||||
```
|
||||
|
||||
しかし、静的リンクでは、このコマンドは次の様になります(OpenBSDの場合):
|
||||
```sh
|
||||
cc -L/usr/local/lib -I/usr/local/include -o sp *.c -static -lgpgme -lcrypto -lc -lassuan -lgpg-error -lthr -lintl
|
||||
```
|
||||
|
||||
## 必要なライブラリを受取方
|
||||
どのライブラリをリンクする必要があるかを知るには、まず動的リンクされたバイナリをコンパイルする必要があります。
|
||||
その後、`ldd` コマンドを使用して必要なライブラリを調べる事が出来ます。
|
||||
|
||||
### OpenBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
sp:
|
||||
Start End Type Open Ref GrpRef Name
|
||||
00000664e28c2000 00000664e28cd000 exe 1 0 0 sp
|
||||
000006678e2b6000 000006678e317000 rlib 0 1 0 /usr/local/lib/libgpgme.so.24.2
|
||||
00000666f3610000 00000666f3824000 rlib 0 1 0 /usr/lib/libcrypto.so.53.0
|
||||
000006672dfe7000 000006672e0de000 rlib 0 1 0 /usr/lib/libc.so.99.0
|
||||
000006670aadd000 000006670aaf5000 rlib 0 1 0 /usr/local/lib/libassuan.so.2.1
|
||||
000006670b08d000 000006670b0b7000 rlib 0 2 0 /usr/local/lib/libgpg-error.so.3.26
|
||||
0000066744e3e000 0000066744e62000 rlib 0 3 0 /usr/local/lib/libintl.so.8.0
|
||||
0000066705496000 00000667055a8000 rlib 0 4 0 /usr/local/lib/libiconv.so.7.1
|
||||
00000667c6522000 00000667c6522000 ld.so 0 1 0 /usr/libexec/ld.so
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB shared object, x86-64, version 1
|
||||
```
|
||||
|
||||
### FreeBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
./sp:
|
||||
libgpgme.so.43 => /usr/local/lib/libgpgme.so.43 (0x15272fd71000)
|
||||
libcrypto.so.30 => /lib/libcrypto.so.30 (0x15272e58e000)
|
||||
libc.so.7 => /lib/libc.so.7 (0x15273063b000)
|
||||
libassuan.so.8 => /usr/local/lib/libassuan.so.8 (0x15272ee04000)
|
||||
libgpg-error.so.0 => /usr/local/lib/libgpg-error.so.0 (0x152731580000)
|
||||
libthr.so.3 => /lib/libthr.so.3 (0x1527317bb000)
|
||||
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x15273205b000)
|
||||
[vdso] (0x15272e207000)
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 14.0 (1400097), FreeBSD-style, stripped
|
||||
```
|
||||
|
||||
### NetBSD
|
||||
```sh
|
||||
$ export LD_LIBRARY_PATH=/usr/pkg/lib:$LD_LIBRARY_PATH
|
||||
$ ldd ./sp
|
||||
./sp:
|
||||
-lgpgme.11 => /usr/pkg/lib/libgpgme.so.11
|
||||
-lassuan.0 => /usr/pkg/lib/libassuan.so.0
|
||||
-lgpg-error.0 => /usr/pkg/lib/libgpg-error.so.0
|
||||
-lintl.1 => /usr/lib/libintl.so.1
|
||||
-lc.12 => /usr/lib/libc.so.12
|
||||
-lcrypto.15 => /usr/lib/libcrypto.so.15
|
||||
-lcrypt.1 => /lib/libcrypt.so.1
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /usr/libexec/ld.elf_so, for NetBSD 10.0, stripped
|
||||
```
|
||||
|
||||
### Void Linux
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
/lib/ld-musl-x86_64.so.1 (0x7f7689c5a000)
|
||||
libgpgme.so.11 => /lib/libgpgme.so.11 (0x7f7689bfb000)
|
||||
libcrypto.so.3 => /lib/libcrypto.so.3 (0x7f7689600000)
|
||||
libc.so => /lib/ld-musl-x86_64.so.1 (0x7f7689c5a000)
|
||||
libassuan.so.0 => /lib/libassuan.so.0 (0x7f7689be6000)
|
||||
libgpg-error.so.0 => /lib/libgpg-error.so.0 (0x7f7689bbe000)
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, BuildID[sha1]=(), stripped
|
||||
```
|
||||
|
||||
## 必要なライブラリをインストールする方法
|
||||
OpenBSDとNetBSDでは、リポジトリからgpgmeのみをインストールすると、必要な全ての「.a」ファイルが既に入手出来ます。
|
||||
流石ね、OppaiBSDとNyuuBSD!
|
||||
|
||||
FreeBSDとVoid Linuxでは、libassuan.a と libgpgme.a のみが不足しています。
|
||||
特にVoid Linuxでは、libgpg-error.a も不足しています。
|
||||
|
||||
しかし、ソースからコンパイルすれば簡単に取得出来るという事です。
|
||||
それではやってみましょう!
|
||||
手順はFreeBSDとVoid Linuxの両方で有効ですので、コマンドは1度だけ提供します。
|
||||
|
||||
### libgpgme-error
|
||||
|
||||
```sh
|
||||
wget https://www.gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.48.tar.gz
|
||||
tar zxfv libgpg-error-1.48.tar.gz
|
||||
cd libgpg-error-1.48
|
||||
./configure --enable-static
|
||||
make
|
||||
doas make install
|
||||
```
|
||||
|
||||
Void Linuxのみ:
|
||||
```sh
|
||||
doas mv /usr/local/lib/libgpg-error.a /usr/lib
|
||||
doas mv /usr/local/lib/libgpg-error.la /usr/lib
|
||||
```
|
||||
|
||||
### libassuan
|
||||
```sh
|
||||
wget https://www.gnupg.org/ftp/gcrypt/libassuan/libassuan-2.5.7.tar.bz2
|
||||
bsdtar -xvf libassuan-2.5.7.tar.bz2
|
||||
cd libassuan-2.5.7
|
||||
./configure --enable-static
|
||||
make
|
||||
doas make install
|
||||
```
|
||||
|
||||
Void Linuxのみ:
|
||||
```sh
|
||||
doas mv /usr/local/lib/libassuan.a /usr/lib
|
||||
doas mv /usr/local/lib/libassuan.la /usr/lib
|
||||
```
|
||||
|
||||
### libgpgme
|
||||
```
|
||||
wget https://www.gnupg.org/ftp/gcrypt/gpgme/gpgme-1.23.2.tar.bz2
|
||||
bsdtar -xvf gpgme-1.23.2.tar.bz2
|
||||
cd gpgme-1.23.2
|
||||
./autogen.sh
|
||||
mkdir build && cd build
|
||||
../configure --enable-maintainer-mode --enable-static
|
||||
make
|
||||
doas make install
|
||||
```
|
||||
|
||||
Void Linuxのみ:
|
||||
```sh
|
||||
doas mv /usr/local/lib/libgpgme.a /usr/lib
|
||||
doas mv /usr/local/lib/libgpgme.la /usr/lib
|
||||
doas mv /usr/local/lib/libgpgmepp.a /usr/lib
|
||||
doas mv /usr/local/lib/libgpgmepp.la /usr/lib
|
||||
```
|
||||
|
||||
必要な全ての「.a」ファイルを取得したら、この投稿の冒頭で提供したコマンドを使用してコンパイルを開始出来ます。
|
||||
|
||||
## 結果
|
||||
### OpenBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
./sp:
|
||||
Start End Type Open Ref GrpRef Name
|
||||
00000a9c31dc9000 00000a9c32131000 dlib 1 0 0 /home/suwako/dev/finish/sp/sp
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB shared object, x86-64, version 1
|
||||
```
|
||||
|
||||
### FreeBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
ldd: ./sp: not a dynamic ELF executable
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), statically linked, for FreeBSD 14.0 (1400097), FreeBSD-style, stripped
|
||||
```
|
||||
|
||||
### NetBSD
|
||||
```sh
|
||||
$ export LD_LIBRARY_PATH=/usr/pkg/lib:$LD_LIBRARY_PATH
|
||||
$ ldd ./sp
|
||||
ldd: /home/suwako/dev/finish/sp/./sp-: invalid ELF class 2; expected 1
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for NetBSD 10.0, stripped
|
||||
```
|
||||
|
||||
### Void Linux
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
ldd: ./sp: Not a valid dynamic program
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=(), stripped
|
||||
```
|
||||
|
||||
## ファイルサイズが大き過ぎ!!
|
||||
静的リンクを行うと、必要な全てのコードがバイナリに含まれる為、再コンパイルする必要なしに異なるコンピュータに単一のバイナリをコピー出来ます。
|
||||
その為、バイナリのサイズは、動的リンクされたバイナリよりもかなり大きくなります。
|
||||
動的リンクされたバイナリはシステム上のどこかにある「.so」ファイルを指すだけであり、システム間で異なる可能性があり、更に使用されているバージョンが異なる可能性がある為、バイナリは全く移植性がありません。
|
||||
ローリングリリースのLinuxディストリビューションを使用している方は、ある時点で自分のプログラムが突然機能しなくなった経験があるかもしれません。
|
||||
これは、「.so」ファイルが新しいバージョンに更新された為に発生しますが、プログラム自体は未だ同じバイナリです。
|
||||
これがあたしが静的リンクを好む理由です!
|
||||
|
||||
但し、コンパイル後に単純に `strip` コマンドを使用する事で、バイナリサイズを大幅に削減できます。
|
||||
警告に気にしないで下さい。これはGNUの開発者の問題です(彼らはlibassuanとgpgmeを作成しました)。
|
||||
あたしの「sp」プログラムは100%のコードが正しいです。
|
||||
|
||||
```sh
|
||||
$ cc -Wall -Wextra -O3 -I/usr/local/include -L/usr/local/lib -o sp *.c -static -lgpgme -lcrypto -lc -lassuan -lgpg-error -lintl -liconv
|
||||
engine-assuan.c(engine-assuan.o:(llass_set_engine_flags) in archive /usr/local/lib/libgpgme.a): warning: strcpy() is almost always misused, please use strlcpy()
|
||||
stringutils.c:107(libgpg_error_la-stringutils.o:(_gpgrt_vfnameconcat) in archive /usr/local/lib/libgpg-error.a): warning: stpcpy() is dangerous; do not use it
|
||||
estream-printf.c:1114(libgpg_error_la-estream-printf.o:(do_format) in archive /usr/local/lib/libgpg-error.a): warning: sprintf() is often misused, please use snprintf()
|
||||
assuan-handler.c(libassuan_la-assuan-handler.o:(assuan_write_status) in archive /usr/local/lib/libassuan.a): warning: strcat() is almost always misused, please use strlcat()
|
||||
|
||||
$ ls -thal sp
|
||||
-rwxr-xr-x 1 suwako suwako 8.9M Apr 16 14:37 sp
|
||||
|
||||
$ strip sp
|
||||
$ ls -thal sp
|
||||
-rwxr-xr-x 1 suwako suwako 3.4M Apr 16 14:39 sp
|
||||
```
|
||||
|
||||
以上
|
|
@ -3,6 +3,7 @@
|
|||
# avatar = gemini://076.moe/static/suwako.jpg
|
||||
# description = テクニカル諏訪子様のtwtxtフィード
|
||||
# link = ホームページ gemini://technicalsuwako.moe
|
||||
2024-04-16T00:00:00Z09:00 【C言語】静的リンクする方法 - gemini://technicalsuwako.moe/blog/c-static-link.gmi
|
||||
2024-04-10T12:00:00Z09:00 【076】保存サイト 1.3.0登場 - gemini://technicalsuwako.moe/blog/hozonsite-130.gmi
|
||||
2024-04-10T00:00:00Z09:00 【デジタル自主】LinuxからOpenBSDに乗り換えた理由 - gemini://technicalsuwako.moe/blog/digital-autonomy-linux-to-openbsd.gmi
|
||||
2024-04-08T00:00:00Z09:00 【076】保存サイト 1.2.0登場 - gemini://technicalsuwako.moe/blog/hozonsite-120.gmi
|
||||
|
|
|
@ -0,0 +1,233 @@
|
|||
title: 【C言語】静的リンクする方法
|
||||
author: 凛
|
||||
date: 2024-04-16
|
||||
tags: jp,blog,c言語,c++,openbsd,freebsd,netbsd,linux,プログラミング
|
||||
----
|
||||
## 注意点
|
||||
もし貴方のLinuxディストリビューションがglibcライブラリを使用している場合、この投稿は恐らく動作しません。\
|
||||
muslを使用したLinuxディストリビューションか、BSD OSをご検討下さい。\
|
||||
muslを使用した人気のあるLinuxディストリビューションには、Void Linux、Gentoo、Alpine Linuxがあります。
|
||||
|
||||
## C言語でのソフトを静的リンクは可能!?
|
||||
はい、可能です。\
|
||||
前述の通り、glibcでは恐らく不可能です。\
|
||||
しかし、muslを使用したLinuxディストリビューションで静的リンクを行うと、glibcを使用したLinuxディストリビューションでも実行出来るという事です。\
|
||||
必要なのは、リンクする全てのライブラリの 「.a」 バージョンです。\
|
||||
コンパイルするコマンドは、動的リンクとは非常に異なる見た目になります。\
|
||||
例として、自分の「sp」を取り上げましょう。
|
||||
|
||||
動的リンクでは、コマンドは次の様になります:
|
||||
```sh
|
||||
cc -L/usr/local/lib -I/usr/local/include -o sp *.c -lgpgme -lassuan
|
||||
```
|
||||
|
||||
しかし、静的リンクでは、このコマンドは次の様になります(OpenBSDの場合):
|
||||
```sh
|
||||
cc -L/usr/local/lib -I/usr/local/include -o sp *.c -static -lgpgme -lcrypto -lc -lassuan -lgpg-error -lthr -lintl
|
||||
```
|
||||
|
||||
## 必要なライブラリを受取方
|
||||
どのライブラリをリンクする必要があるかを知るには、まず動的リンクされたバイナリをコンパイルする必要があります。\
|
||||
その後、`ldd` コマンドを使用して必要なライブラリを調べる事が出来ます。
|
||||
|
||||
### OpenBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
sp:
|
||||
Start End Type Open Ref GrpRef Name
|
||||
00000664e28c2000 00000664e28cd000 exe 1 0 0 sp
|
||||
000006678e2b6000 000006678e317000 rlib 0 1 0 /usr/local/lib/libgpgme.so.24.2
|
||||
00000666f3610000 00000666f3824000 rlib 0 1 0 /usr/lib/libcrypto.so.53.0
|
||||
000006672dfe7000 000006672e0de000 rlib 0 1 0 /usr/lib/libc.so.99.0
|
||||
000006670aadd000 000006670aaf5000 rlib 0 1 0 /usr/local/lib/libassuan.so.2.1
|
||||
000006670b08d000 000006670b0b7000 rlib 0 2 0 /usr/local/lib/libgpg-error.so.3.26
|
||||
0000066744e3e000 0000066744e62000 rlib 0 3 0 /usr/local/lib/libintl.so.8.0
|
||||
0000066705496000 00000667055a8000 rlib 0 4 0 /usr/local/lib/libiconv.so.7.1
|
||||
00000667c6522000 00000667c6522000 ld.so 0 1 0 /usr/libexec/ld.so
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB shared object, x86-64, version 1
|
||||
```
|
||||
|
||||
### FreeBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
./sp:
|
||||
libgpgme.so.43 => /usr/local/lib/libgpgme.so.43 (0x15272fd71000)
|
||||
libcrypto.so.30 => /lib/libcrypto.so.30 (0x15272e58e000)
|
||||
libc.so.7 => /lib/libc.so.7 (0x15273063b000)
|
||||
libassuan.so.8 => /usr/local/lib/libassuan.so.8 (0x15272ee04000)
|
||||
libgpg-error.so.0 => /usr/local/lib/libgpg-error.so.0 (0x152731580000)
|
||||
libthr.so.3 => /lib/libthr.so.3 (0x1527317bb000)
|
||||
libintl.so.8 => /usr/local/lib/libintl.so.8 (0x15273205b000)
|
||||
[vdso] (0x15272e207000)
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 14.0 (1400097), FreeBSD-style, stripped
|
||||
```
|
||||
|
||||
### NetBSD
|
||||
```sh
|
||||
$ export LD_LIBRARY_PATH=/usr/pkg/lib:$LD_LIBRARY_PATH
|
||||
$ ldd ./sp
|
||||
./sp:
|
||||
-lgpgme.11 => /usr/pkg/lib/libgpgme.so.11
|
||||
-lassuan.0 => /usr/pkg/lib/libassuan.so.0
|
||||
-lgpg-error.0 => /usr/pkg/lib/libgpg-error.so.0
|
||||
-lintl.1 => /usr/lib/libintl.so.1
|
||||
-lc.12 => /usr/lib/libc.so.12
|
||||
-lcrypto.15 => /usr/lib/libcrypto.so.15
|
||||
-lcrypt.1 => /lib/libcrypt.so.1
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /usr/libexec/ld.elf_so, for NetBSD 10.0, stripped
|
||||
```
|
||||
|
||||
### Void Linux
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
/lib/ld-musl-x86_64.so.1 (0x7f7689c5a000)
|
||||
libgpgme.so.11 => /lib/libgpgme.so.11 (0x7f7689bfb000)
|
||||
libcrypto.so.3 => /lib/libcrypto.so.3 (0x7f7689600000)
|
||||
libc.so => /lib/ld-musl-x86_64.so.1 (0x7f7689c5a000)
|
||||
libassuan.so.0 => /lib/libassuan.so.0 (0x7f7689be6000)
|
||||
libgpg-error.so.0 => /lib/libgpg-error.so.0 (0x7f7689bbe000)
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, BuildID[sha1]=(), stripped
|
||||
```
|
||||
|
||||
## 必要なライブラリをインストールする方法
|
||||
OpenBSDとNetBSDでは、リポジトリからgpgmeのみをインストールすると、必要な全ての「.a」ファイルが既に入手出来ます。\
|
||||
流石ね、OppaiBSDとNyuuBSD!
|
||||
|
||||
FreeBSDとVoid Linuxでは、libassuan.a と libgpgme.a のみが不足しています。\
|
||||
特にVoid Linuxでは、libgpg-error.a も不足しています。
|
||||
|
||||
しかし、ソースからコンパイルすれば簡単に取得出来るという事です。\
|
||||
それではやってみましょう!\
|
||||
手順はFreeBSDとVoid Linuxの両方で有効ですので、コマンドは1度だけ提供します。
|
||||
|
||||
### libgpgme-error
|
||||
|
||||
```sh
|
||||
wget https://www.gnupg.org/ftp/gcrypt/libgpg-error/libgpg-error-1.48.tar.gz
|
||||
tar zxfv libgpg-error-1.48.tar.gz
|
||||
cd libgpg-error-1.48
|
||||
./configure --enable-static
|
||||
make
|
||||
doas make install
|
||||
```
|
||||
|
||||
Void Linuxのみ:
|
||||
```sh
|
||||
doas mv /usr/local/lib/libgpg-error.a /usr/lib
|
||||
doas mv /usr/local/lib/libgpg-error.la /usr/lib
|
||||
```
|
||||
|
||||
### libassuan
|
||||
```sh
|
||||
wget https://www.gnupg.org/ftp/gcrypt/libassuan/libassuan-2.5.7.tar.bz2
|
||||
bsdtar -xvf libassuan-2.5.7.tar.bz2
|
||||
cd libassuan-2.5.7
|
||||
./configure --enable-static
|
||||
make
|
||||
doas make install
|
||||
```
|
||||
|
||||
Void Linuxのみ:
|
||||
```sh
|
||||
doas mv /usr/local/lib/libassuan.a /usr/lib
|
||||
doas mv /usr/local/lib/libassuan.la /usr/lib
|
||||
```
|
||||
|
||||
### libgpgme
|
||||
```
|
||||
wget https://www.gnupg.org/ftp/gcrypt/gpgme/gpgme-1.23.2.tar.bz2
|
||||
bsdtar -xvf gpgme-1.23.2.tar.bz2
|
||||
cd gpgme-1.23.2
|
||||
./autogen.sh
|
||||
mkdir build && cd build
|
||||
../configure --enable-maintainer-mode --enable-static
|
||||
make
|
||||
doas make install
|
||||
```
|
||||
|
||||
Void Linuxのみ:
|
||||
```sh
|
||||
doas mv /usr/local/lib/libgpgme.a /usr/lib
|
||||
doas mv /usr/local/lib/libgpgme.la /usr/lib
|
||||
doas mv /usr/local/lib/libgpgmepp.a /usr/lib
|
||||
doas mv /usr/local/lib/libgpgmepp.la /usr/lib
|
||||
```
|
||||
|
||||
必要な全ての「.a」ファイルを取得したら、この投稿の冒頭で提供したコマンドを使用してコンパイルを開始出来ます。
|
||||
|
||||
## 結果
|
||||
### OpenBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
./sp:
|
||||
Start End Type Open Ref GrpRef Name
|
||||
00000a9c31dc9000 00000a9c32131000 dlib 1 0 0 /home/suwako/dev/finish/sp/sp
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB shared object, x86-64, version 1
|
||||
```
|
||||
|
||||
### FreeBSD
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
ldd: ./sp: not a dynamic ELF executable
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), statically linked, for FreeBSD 14.0 (1400097), FreeBSD-style, stripped
|
||||
```
|
||||
|
||||
### NetBSD
|
||||
```sh
|
||||
$ export LD_LIBRARY_PATH=/usr/pkg/lib:$LD_LIBRARY_PATH
|
||||
$ ldd ./sp
|
||||
ldd: /home/suwako/dev/finish/sp/./sp-: invalid ELF class 2; expected 1
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for NetBSD 10.0, stripped
|
||||
```
|
||||
|
||||
### Void Linux
|
||||
```sh
|
||||
$ ldd ./sp
|
||||
ldd: ./sp: Not a valid dynamic program
|
||||
|
||||
$ file ./sp
|
||||
./sp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=(), stripped
|
||||
```
|
||||
|
||||
## ファイルサイズが大き過ぎ!!
|
||||
静的リンクを行うと、必要な全てのコードがバイナリに含まれる為、再コンパイルする必要なしに異なるコンピュータに単一のバイナリをコピー出来ます。\
|
||||
その為、バイナリのサイズは、動的リンクされたバイナリよりもかなり大きくなります。\
|
||||
動的リンクされたバイナリはシステム上のどこかにある「.so」ファイルを指すだけであり、システム間で異なる可能性があり、更に使用されているバージョンが異なる可能性がある為、バイナリは全く移植性がありません。\
|
||||
ローリングリリースのLinuxディストリビューションを使用している方は、ある時点で自分のプログラムが突然機能しなくなった経験があるかもしれません。\
|
||||
これは、「.so」ファイルが新しいバージョンに更新された為に発生しますが、プログラム自体は未だ同じバイナリです。\
|
||||
これがあたしが静的リンクを好む理由です!
|
||||
|
||||
但し、コンパイル後に単純に `strip` コマンドを使用する事で、バイナリサイズを大幅に削減できます。\
|
||||
警告に気にしないで下さい。これはGNUの開発者の問題です(彼らはlibassuanとgpgmeを作成しました)。\
|
||||
あたしの「sp」プログラムは100%のコードが正しいです。
|
||||
|
||||
```sh
|
||||
$ cc -Wall -Wextra -O3 -I/usr/local/include -L/usr/local/lib -o sp *.c -static -lgpgme -lcrypto -lc -lassuan -lgpg-error -lintl -liconv
|
||||
engine-assuan.c(engine-assuan.o:(llass_set_engine_flags) in archive /usr/local/lib/libgpgme.a): warning: strcpy() is almost always misused, please use strlcpy()
|
||||
stringutils.c:107(libgpg_error_la-stringutils.o:(_gpgrt_vfnameconcat) in archive /usr/local/lib/libgpg-error.a): warning: stpcpy() is dangerous; do not use it
|
||||
estream-printf.c:1114(libgpg_error_la-estream-printf.o:(do_format) in archive /usr/local/lib/libgpg-error.a): warning: sprintf() is often misused, please use snprintf()
|
||||
assuan-handler.c(libassuan_la-assuan-handler.o:(assuan_write_status) in archive /usr/local/lib/libassuan.a): warning: strcat() is almost always misused, please use strlcat()
|
||||
|
||||
$ ls -thal sp
|
||||
-rwxr-xr-x 1 suwako suwako 8.9M Apr 16 14:37 sp
|
||||
|
||||
$ strip sp
|
||||
$ ls -thal sp
|
||||
-rwxr-xr-x 1 suwako suwako 3.4M Apr 16 14:39 sp
|
||||
```
|
||||
|
||||
以上
|
読み込み中…
新しいイシューから参照