<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://tech.wtfu.site/devops/build/gcc/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><managingEditor>contact@wtfu.site (eli_w)</managingEditor><webMaster>contact@wtfu.site (eli_w)</webMaster><atom:link href="https://tech.wtfu.site/devops/build/gcc/rss.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://tech.wtfu.site/devops/build/gcc/library-link/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>contact@wtfu.site (eli_w)</author><guid>https://tech.wtfu.site/devops/build/gcc/library-link/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introdll--so--静态链接库--动态链接库--程序员的自我修养--链接装载与库高清带完整书签版pdf阅读笔记">
 Intro(DLL | SO | 静态链接库 | 动态链接库 | 程序员的自我修养&amp;ndash;链接、装载与库(高清带完整书签版).pdf.[阅读笔记])
 &lt;a class="anchor" href="#introdll--so--%e9%9d%99%e6%80%81%e9%93%be%e6%8e%a5%e5%ba%93--%e5%8a%a8%e6%80%81%e9%93%be%e6%8e%a5%e5%ba%93--%e7%a8%8b%e5%ba%8f%e5%91%98%e7%9a%84%e8%87%aa%e6%88%91%e4%bf%ae%e5%85%bb--%e9%93%be%e6%8e%a5%e8%a3%85%e8%bd%bd%e4%b8%8e%e5%ba%93%e9%ab%98%e6%b8%85%e5%b8%a6%e5%ae%8c%e6%95%b4%e4%b9%a6%e7%ad%be%e7%89%88pdf%e9%98%85%e8%af%bb%e7%ac%94%e8%ae%b0">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="数据结构elfhttpsgithubcomtorvaldslinuxblobmasterincludeuapilinuxelfh">
 


 &lt;a href="https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h" rel="noopener" target="_blank">数据结构(ELF)&lt;/a>
 &lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84elfhttpsgithubcomtorvaldslinuxblobmasterincludeuapilinuxelfh">#&lt;/a>
&lt;/h3>
&lt;h6 id="section" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="shstrtab" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="strtab" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="dynstr" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="symtabdynsym" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="dynamic" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="rel" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="gotgotplt" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="pltpltgot" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="gnu" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="note" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="section" class="docsify-tabs__tab" data-tab="Section">Section&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="section">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">readelf -S -W build/Lib.so

typedef struct elf64_shdr {
 // 段名（段名是个字符串，它位于一个叫做“.shstrtab”的字符串表。sh_name 是段名字符串在“.shstrtab”中字符串数据的偏移
 Elf64_Word sh_name;		/* Section name, index in string tbl */
 // 段的类型
 Elf64_Word sh_type;		/* Type of section */
 // 段的标志位
 Elf64_Xword sh_flags;		/* Miscellaneous section attributes */
 // 段虚拟地址2（如果该段可以被加载，则 sh_addr 为该段被加载后在进程地址空间中的虚拟地址；否则 sh_addr 为 0
 Elf64_Addr sh_addr;		/* Section virtual addr at execution */
 // 段偏移（如果该段存在于文件中,则表示该段在文件中的偏移;否则无意义。比如 sh_offset 对于 BSS 段来说就没有意义
 Elf64_Off sh_offset;		/* Section file offset */
 // 段的长度
 Elf64_Xword sh_size;		/* Size of section in bytes */
 // 段链接信息
 Elf64_Word sh_link;		/* Index of another section */
 Elf64_Word sh_info;		/* Additional section information */
 // 段地址对齐（有些段对段地址对齐有要求,比如我们假设有个段刚开始的位置包含了一个 double 变量,因为 Intel x86 系统要求浮点数的存储地址必须是本身的整数倍，
 // 也就是说保存 double 变量的地址必须是 8 字节的整数倍。这样对一个段来说，它的 sh_addr 必须是 8 的整数倍。
 // 由于地址对齐的数量都是 2 的指数倍，sh_addralign 表示是地址对齐数量中的指数，即 sh addrlign=3表示对齐为2的3次方倍，即8倍，依此类推。
 // 所以一个段的地址 sh_addr 必须满足下面的条件，即 sh addr % (2**sh addralign) = 0。 **表示指数运算。如果 sh_addralign 为 0 或 1，则表示该段没有对齐要求
 Elf64_Xword sh_addralign;	/* Section alignment */
 // 项的长度（有些段包含了一些固定大小的项，比如符号表，它包含的每个符号所占的大小都是一样的。对于这种段，sh_entsize 表示每个项的大小。如果为 0，则表示该段不包含固定大小的项
 Elf64_Xword sh_entsize;	/* Entry size if section holds table */
} Elf64_Shdr;
&lt;/code>&lt;/pre>&lt;/div>
 &lt;details>&lt;summary>属性值&lt;/summary>
&lt;h6 id="sh_type" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="sh_flags" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="sh_linksh_info" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="sh_type" class="docsify-tabs__tab" data-tab="sh_type">sh_type&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="sh_type">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th align="left">常量&lt;/th>
&lt;th align="left">值&lt;/th>
&lt;th align="left">含义&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td align="left">SHT_NULL&lt;/td>
&lt;td align="left">0&lt;/td>
&lt;td align="left">无效段&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_PROGBITS&lt;/td>
&lt;td align="left">1&lt;/td>
&lt;td align="left">程序段、代码段、数据段都是这种类型的&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_SYMTAB&lt;/td>
&lt;td align="left">2&lt;/td>
&lt;td align="left">表示该段的内容为&lt;strong>符号表&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_STRTAB&lt;/td>
&lt;td align="left">3&lt;/td>
&lt;td align="left">表示该段的内容为&lt;strong>字符串表&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_RELA&lt;/td>
&lt;td align="left">4&lt;/td>
&lt;td align="left">重定位表。该段包含了重定位信息，具体参考“静态地址决议和重定位”这一节&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_HASH&lt;/td>
&lt;td align="left">5&lt;/td>
&lt;td align="left">符号表的哈希表。见“符号表”这一节&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_DYNAMIC&lt;/td>
&lt;td align="left">6&lt;/td>
&lt;td align="left">动态链接信息。具体见“动态链接”一章&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_NOTE&lt;/td>
&lt;td align="left">7&lt;/td>
&lt;td align="left">提示性信息&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_NOBITS&lt;/td>
&lt;td align="left">8&lt;/td>
&lt;td align="left">表示该段在文件中没内容，比如 .bss 段&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_REL&lt;/td>
&lt;td align="left">9&lt;/td>
&lt;td align="left">该段包含了重定位信息，具体参考“静态地址决议和重定位”这一节&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_SHLIB&lt;/td>
&lt;td align="left">10&lt;/td>
&lt;td align="left">保留&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_DNYSYM&lt;/td>
&lt;td align="left">11&lt;/td>
&lt;td align="left">动态链接的符号表。具体见“动态链接”一章&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>&lt;button anchorId="sh_flags" class="docsify-tabs__tab" data-tab="sh_flags">sh_flags&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="sh_flags">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th align="left">常量&lt;/th>
&lt;th align="left">值&lt;/th>
&lt;th align="left">含义&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td align="left">SHF_WRITE&lt;/td>
&lt;td align="left">1&lt;/td>
&lt;td align="left">表示该段在进程空间中可写&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHF_ALLOC&lt;/td>
&lt;td align="left">2&lt;/td>
&lt;td align="left">表示该段在进程空间中必须要分配空间。有些包含指示或控制信息的段不须要在进程空间中被分配空间，它们一般不会有这个标志。像代码段、数据段和 .bss 段都会有这个标志位&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHF_EXECINSTR&lt;/td>
&lt;td align="left">4&lt;/td>
&lt;td align="left">表示该段在进程空间中可以被执行，一般指代码段&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>&lt;button anchorId="sh_linksh_info" class="docsify-tabs__tab" data-tab="sh_link/sh_info">sh_link/sh_info&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="sh_linksh_info">
&lt;table>
&lt;thead>
&lt;tr>
&lt;th align="left">sh_type&lt;/th>
&lt;th align="left">sh_link&lt;/th>
&lt;th align="left">sh_info&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td align="left">SHT_DYNAMIC&lt;/td>
&lt;td align="left">该段所使用的字符串表在段表中的下标&lt;/td>
&lt;td align="left">0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_HASH&lt;/td>
&lt;td align="left">该段所使用的符号表在段表中的下标&lt;/td>
&lt;td align="left">0&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_REL&lt;br>SHT_RELA&lt;/td>
&lt;td align="left">该段所使用的相应符号表在段表中的下标&lt;/td>
&lt;td align="left">该重定位表所作用的段在段表中的下标&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">SHT_SYMTAB&lt;br>SHT_DYNSYM&lt;/td>
&lt;td align="left">操作系统相关的&lt;/td>
&lt;td align="left">操作系统相关的&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">other&lt;/td>
&lt;td align="left">SHN_UNDEF&lt;/td>
&lt;td align="left">0&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
 &lt;/div>&lt;/div>
 &lt;/details>
&lt;/div>&lt;button anchorId="shstrtab" class="docsify-tabs__tab" data-tab=".shstrtab">.shstrtab&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="shstrtab">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">// readelf -p .shstrtab build/Lib.so

String dump of section '.shstrtab':
[ 1] .symtab
[ 9] .strtab
[ 11] .shstrtab
[ 1b] .note.gnu.build-id
[ 2e] .gnu.hash
[ 38] .dynsym
[ 40] .dynstr
[ 48] .gnu.version
[ 55] .gnu.version_r
[ 64] .rel.dyn
[ 6d] .rel.plt
[ 76] .init
[ 7c] .plt.got
[ 85] .text
[ 8b] .fini
[ 91] .rodata
[ 99] .eh_frame_hdr
[ a7] .eh_frame
[ b1] .init_array
[ bd] .fini_array
[ c9] .dynamic
[ d2] ...
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="strtab" class="docsify-tabs__tab" data-tab=".strtab">.strtab&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="strtab">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">// readelf -p .strtab build/Lib.so

String dump of section '.strtab':
[ 1] crtstuff.c
[ 21] __do_global_dtors_aux
[ 43] __do_global_dtors_aux_fini_array_entry
[ 76] __frame_dummy_init_array_entry
[ 95] Lib.c
[ 9b] __FRAME_END__
[ a9] __x86.get_pc_thunk.bx
[ bf] _fini
[ c5] __x86.get_pc_thunk.dx
[ db] __dso_handle
[ e8] _DYNAMIC
[ f1] __GNU_EH_FRAME_HDR
[ 104] __TMC_END__
[ 110] _GLOBAL_OFFSET_TABLE_
[ 126] _init
[ 12c] _ITM_deregisterTMCloneTable
[ 148] printf@GLIBC_2.0
[ 159] foobar
[ 160] __cxa_finalize@GLIBC_2.1.3
[ 17b] puts@GLIBC_2.0
[ 18a] __gmon_start__
[ 199] _ITM_registerTMCloneTable
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="dynstr" class="docsify-tabs__tab" data-tab=".dynstr">.dynstr&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="dynstr">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">// readelf -p .dynstr -W build/Lib.so

String dump of section '.dynstr':
 [ 1] __gmon_start__
 [ 10] _ITM_deregisterTMCloneTable
 [ 2c] _ITM_registerTMCloneTable
 [ 46] __cxa_finalize
 [ 55] foobar
 [ 5c] printf
 [ 63] puts
 [ 68] libc.so.6
 [ 72] GLIBC_2.1.3
 [ 7e] GLIBC_2.0
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>&lt;button anchorId="symtabdynsym" class="docsify-tabs__tab" data-tab=".symtab/.dynsym">.symtab/.dynsym&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="symtabdynsym"> &lt;div class="docsify-example-panels">&lt;p>&lt;code>readelf --syms -W build/Lib.so&lt;/code>，这个也会将动态符号表读取出来
&lt;br>&lt;code>readelf --dyn-syms -W build/Lib.so&lt;/code>、&lt;code>readelf -sD -W build/Lib.so&lt;/code>，动态符号表&lt;/p></description></item><item><title/><link>https://tech.wtfu.site/devops/build/gcc/library/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>contact@wtfu.site (eli_w)</author><guid>https://tech.wtfu.site/devops/build/gcc/library/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introlinux共享库静态库动态链接库">
 Intro(Linux共享库，静态库，动态链接库)
 &lt;a class="anchor" href="#introlinux%e5%85%b1%e4%ba%ab%e5%ba%93%e9%9d%99%e6%80%81%e5%ba%93%e5%8a%a8%e6%80%81%e9%93%be%e6%8e%a5%e5%ba%93">#&lt;/a>
&lt;/h2>
&lt;p style="text-align: center;">&lt;img src="https://tech.wtfu.site/.images/devops/build/gcc/lib/lib-01.png" alt="">&lt;/p>
&lt;ul>
&lt;li>
&lt;h3 id="介绍">
 介绍
 &lt;a class="anchor" href="#%e4%bb%8b%e7%bb%8d">#&lt;/a>
&lt;/h3>
&lt;p class="warn">程序函数库可分为3种类型：静态函数库（static libraries）、共享函数库（shared libraries）、动态加载函数库（dynamically loaded libraries):&lt;/p>
&lt;ol>
&lt;li>静态函数库，是在程序执行前就加入到目标程序中去了 ；&lt;/li>
&lt;li>动态函数库同共享函数库是一个东西（在linux上叫共享对象库， 文件后缀是.so ，windows上叫动态加载函数库， 文件后缀是.dll）&lt;/li>
&lt;/ol>
&lt;p>linux中命名系统的共享库的规则
&lt;br>&lt;img src="https://tech.wtfu.site/.images/devops/build/gcc/lib/lib-02.png" alt="">&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="代码实现">
 代码实现
 &lt;a class="anchor" href="#%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0">#&lt;/a>
&lt;/h3>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" data-file="libhello.c" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">/* libhello.c - demonstrate library use. */
#include &amp;lt;stdio.h&amp;gt;

void hello(void) {
 printf(&amp;quot;Hello, library world.\n&amp;quot;);
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" data-file="libhello.h" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">/* libhello.h - demonstrate library use. */

void hello(void);
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="staticshared_sample" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="module_sample" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="staticshared_sample" class="docsify-tabs__tab" data-tab="[STATIC、SHARED]_sample">[STATIC、SHARED]_sample&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="staticshared_sample">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" data-file="demo_use.c" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">/* demo_use.c -- demonstrate direct use of the &amp;quot;hello&amp;quot; routine */
#include &amp;quot;libhello.h&amp;quot;

int main(void) {
 hello();
 return 0;
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;h6 id="static" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;h6 id="shared" class="anchor_hr" style="font-size: 0rem; margin: 0; padding: 0; border-width: 0px;">&lt;/h6>&lt;div class="docsify-tabs docsify-tabs--classic">&lt;button anchorId="static" class="docsify-tabs__tab" data-tab="[STATIC]">[STATIC]&lt;/button>&lt;div class="docsify-tabs__content" data-tab-content="static">
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="shell" data-line="" class="language-shell line-numbers" style="max-height: none">&lt;code class="language-shell"># Static library demo

# Create static library's object file, libhello-static.o.
# I'm using the name libhello-static to clearly
# differentiate the static library from the
# dynamic library examples, but you don't need to use
# &amp;quot;-static&amp;quot; in the names of your
# object files or static libraries.

# -Wall: 这个选项会开启编译器的所有警告信息。它告诉编译器在编译过程中显示尽可能多的警告，帮助开发者发现潜在的问题。
# -g: 这个选项生成用于调试的额外信息，包括源代码中的行号、变量名称等。这些信息会被包含在目标文件中，便于调试程序。
# -c: 这个选项告诉编译器只进行编译，而不进行链接。它会将源文件编译成目标文件，但不会生成可执行文件。
gcc -Wall -g -c -o libhello-static.o libhello.c

# Create static library.
ar rcs libhello-static.a libhello-static.o

# At this point we could just copy libhello-static.a
# somewhere else to use it.
# For demo purposes, we'll just keep the library
# in the current directory.

# Compile demo_use program file.

gcc -Wall -g -c demo_use.c -o demo_use.o

# Create demo_use program; -L. causes &amp;quot;.&amp;quot; to be searched during
# creation of the program. Note that this command causes
# the relevant object file in libhello-static.a to be
# incorporated into file demo_use_static.

# -L.: 这个选项告诉链接器在当前目录 (.) 中查找库文件。
# -lhello-static: 这个选项告诉链接器要链接名为 libhello-static.a 或 libhello-static.so 的库文件。
gcc -g -o demo_use_static demo_use.o -L. -lhello-static

# Execute the program.

./demo_use_static
&lt;/code>&lt;/pre>&lt;/div>
&lt;p class="tip">static 中 删除中间对象，比如&lt;code>rm -f libhello-static.a libhello-static.o&lt;/code> 后，编译出来的 demo_use_static也可以正常执行。
&lt;br>&lt;br>&lt;strong>ar&lt;/strong> 归档工具的作用就是将多个&lt;code>.o&lt;/code>文件压缩到一个&lt;code>.a&lt;/code>文件中(包括一些额外的元信息)。方便使用 &lt;strong>-l&lt;/strong> 对&lt;code>.a&lt;/code>、&lt;code>.o&lt;/code>文件进行链接。
&lt;br>⫸ 如果只有单个&lt;code>.o&lt;/code>文件的话，直接链接，不使用任何参数：&lt;code>gcc -g -o main demo_use.o libhello-static.o&lt;/code>&lt;/p></description></item></channel></rss>