From 4a43a4dad8496eba617f5bb18c23eea3a81cbf6d Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Tue, 21 Jun 2022 17:51:16 +0800 Subject: [PATCH] added article to introduce ifunc --- articles/20220621-ifunc.md | 353 ++++++++++++++++++++++++ articles/code/20220621-ifunc/Makefile | 25 ++ articles/code/20220621-ifunc/ifunc.c | 46 +++ articles/code/20220621-ifunc/main.c | 21 ++ articles/code/20220621-ifunc/no_ifunc.c | 33 +++ articles/diagrams/linker-loader.png | Bin 0 -> 67644 bytes 6 files changed, 478 insertions(+) create mode 100644 articles/20220621-ifunc.md create mode 100644 articles/code/20220621-ifunc/Makefile create mode 100644 articles/code/20220621-ifunc/ifunc.c create mode 100644 articles/code/20220621-ifunc/main.c create mode 100644 articles/code/20220621-ifunc/no_ifunc.c create mode 100644 articles/diagrams/linker-loader.png diff --git a/articles/20220621-ifunc.md b/articles/20220621-ifunc.md new file mode 100644 index 0000000..fb3e1da --- /dev/null +++ b/articles/20220621-ifunc.md @@ -0,0 +1,353 @@ +![](./diagrams/linker-loader.png) + +文章标题:**GNU IFUNC 介绍(RISC-V 版)** + +- 作者:汪辰 +- 联系方式: / + +文章大纲 + + +- [1. 参考](#1-参考) +- [2. 什么是 IFUNC](#2-什么是-ifunc) +- [3. IFUNC 的用法](#3-ifunc-的用法) + - [3.1. 传统方式(非 IFUNC)](#31-传统方式非-ifunc) + - [3.2. GNU IFUNC](#32-gnu-ifunc) +- [4. IFUNC 的实现细节分析](#4-ifunc-的实现细节分析) + - [4.1. Preemptible IFUNC](#41-preemptible-ifunc) + - [4.2. Non-preemptible IFUNC](#42-non-preemptible-ifunc) + - [4.3. 简单总结](#43-简单总结) + + + + +# 1. 参考 + +本文主要参考了如下内容: + +- 【参考 1】[GNU_IFUNC from glibc wiki][1] +- 【参考 2】[6.33.1 Common Function Attributes from gcc 11.3.0 user manual][2] +- 【参考 3】[GNU indirect function 的運作機制][3] +- 【参考 4】[GNU indirect function][5] + +# 2. 什么是 IFUNC + +借鉴 [【参考 2】][2] 的原话: + +> The GNU indirect function support (IFUNC) is a feature of the GNU toolchain that allows a developer to create multiple implementations of a given function and to select amongst them at runtime using a resolver function which is also written by the developer. The resolver function is called by the dynamic loader during early startup to resolve which of the implementations will be used by the application. Once an implementation choice is made it is fixed and may not be changed for the lifetime of the process. + +IFUNC,全称为 indirect function,是由 GNU toolchain 实现的一个特性,特性描述可以通过以下关键词来掌握: + +- 可以为某个函数创建多个实现 +- 在运行时使用解析器函数(resolver function)进行选择。 +- 解析器函数由动态加载程序调用,选择实际的实现。(注:静态链接下同样也支持 IFUNC,但本文只分析动态链接下的处理) +- 选择完成后,函数实现就是固定的,在进程的生存期内不得更改。 + +下面就围绕这些关键词,并结合一些 RISC-V 的例子来理解 IFUNC 究竟是什么、如何使用它以及背后实现的机制。 + +# 3. IFUNC 的用法 + +## 3.1. 传统方式(非 IFUNC) + +假设我们要写一个程序,需要实现一个函数 myfunc,这个函数根据我们配置的不同执行不同的处理,一般情况下我们会写成如下这般: + +(注,具体代码实例参考 [这里][4],本文在讲解时为演示方便,截取的代码会稍有调整。) + +```cpp +static int myfunc_1 (int a) +{ + printf("myfunc_1 is called\n"); + return a + 100; +} + +static int myfunc_2 (int a){ + printf("myfunc_2 is called\n"); + return a + 200; +} + +int myfunc(int a) +{ + printf("myfunc is called\n"); + if (1 == get_configure()) { + return myfunc_1(a); + } else { + return myfunc_2(a); + } +} + +void test_myfunc() +{ + for (int i = 0; i < 3; i++) { + printf("myfunc returns %d\n", myfunc(1)); + } +} +``` + +`myfunc()` 中根据 `get_configure()` 函数返回的配置情况选择执行 `myfunc_1()` 或者 `myfunc_2()`。我们将这个函数实现在一个共享库中,并封装了一个 `test_myfunc()` 来反复调用 `myfunc()` 这个函数三次。然后写一个可执行程序来调用 `test_myfunc()`。之所以再写一个 `test_myfunc()` 来封装调用 `myfunc()`,主要是为了后面演示 IFUNC 的需要。读者可以读完本文后自行体会。 + +```cpp +extern void test_myfunc(); + +int main() +{ + printf("main ......\n"); + test_myfunc(); + return 0; +} +``` + +然后编译执行,我这里使用的 riscv gcc 版本是 v11.1.0,qemu 用的是 v6.2.0。 + +```console +$ riscv64-unknown-linux-gnu-gcc -shared -fPIC no_ifunc.c -o no_ifunc.so +$ riscv64-unknown-linux-gnu-gcc main.c -DMY_CONFIG=1 no_ifunc.so -o a.out +``` +`MY_CONFIG` 定义为 1 后 `get_configure()` 返回 1,所以调用 `myfunc()` 就会最终触发 `myfunc_1()` + +如果我们希望 `myfunc()` 触发 `myfunc_2()`,可以在编译 `a.out` 时指定 `MY_CONFIG=2` + +输入如下命令执行程序,其中 `-L` 指定动态链接器的路径, `-E LD_LIBRARY_PATH=.` 指示动态链接器到当前路径下去加载 `a.out` 所依赖的 `no_ifunc.so`。 + +```console +$ qemu-riscv64 -L /home/u/ws/test-gcc/install/sysroot/ -E LD_LIBRARY_PATH=. ./a.out +main ...... +myfunc is called +myfunc_1 is called +myfunc returns 101 +myfunc is called +myfunc_1 is called +myfunc returns 101 +myfunc is called +myfunc_1 is called +myfunc returns 101 +``` + +我们主要来关注一下程序的输出,我们看到三次执行 myfunc 导致 "myfunc is called" 被打印了三次,可见 `myfunc()` 函数中的 if-else 逻辑也被执行了三次。那么有没有更快的处理机制呢,假设 `MY_CONFIG` 的信息在程序启动后是不变的,那么最好的方法是让程序在第一次执行 myfunc 后就记住 myfunc 实际对应的是 `myfunc_1()` 或者 `myfunc_2()`,后面再执行时就不用每次都判断了,这对于那种经常要被调用的函数来说是一种运行上的优化。 + +## 3.2. GNU IFUNC + +在实际工作中此类需求也很广泛,譬如我们在应用态编程经常使用的 `memcpy()` 这类函数,在不同的架构下针对不同的处理器指令扩展存在多个优化版本,那么这个 `memcpy()` 函数就好比这里的 `myfunc()` 函数。 + +为了解决这样的现象,从 2009 年起,GNU C 函式库(glibc,其中包含了动态链接器)开始对 ELF 格式进行扩展,增加新的符号类型 `STT_GNU_IFUNC`,以及新的重定位类型 `R_*_IRELATIVE`(这里的 `*` 表示根据硬件处理器架构不同存在变化,譬如如果是 RISC-V,那就是 `R_RISCV_IRELATIVE`,如果是 64 位的 X86,那就是`R_X86_64_IRELATIVE`。本文以 RISC-V 为例,所以后面就直接写成 `R_RISCV_IRELATIVE`,但读者需要知道针对不同的 ARCH,这个 `*` 是会变化的);同时为了支持 IFUNC 这个新特性,GNU Binutils(包括链接器 ld 和汇编器 as)也对此进行了扩展。 + +从历史上来看,在 Glibc 之后,编译器 GCC 也从版本 4.6 开始增加了对 IFUNC 的支持,并在版本 4.8 提供了内建函数 `__builtin_cpu_is()` 和 `__builtin_cpu_supports()`,来协助应用程序的作者判断 CPU 的类型。 + +下面我们来根据 GNU IFUNC 的设计要求,实现一个利用 IFUNC 特性的 `myfunc()`。为了让 `myfunc()` 函数能够达到我们前面希望只做一次选择,后面反复调用时记住选择直接调用已经选择好的目标函数。我们必须提供一个函数来选择实际要使用的函数,在 IFUNC 的术语中我们称呼这个函数为解析器(resolver)。也就是下面代码中的 `myfunc_resolver()`。同时我们利用编译器 GCC 提供的函数属性(function attribute)关键字 `ifunc` 来修饰 `myfunc()` 函数,作用相当于将这个 resolver 和我们的 `myfunc()` 目标函数实现了绑定。新的代码如下,我们会把它编译成共享库 `ifunc.so` + +```cpp +int myfunc(int) __attribute__((ifunc ("myfunc_resolver"))); + +int (*myfunc_resolver(void))(int) +{ + printf("myfunc_resolver is called\n"); + if (1 == get_configure()) { + return myfunc_1; + } else { + return myfunc_2; + } +} +``` + +具体的代码和构建命令我就不在文章中粘贴了,感兴趣的读者可以去看本文附带的 [代码仓库][4],执行 `make ifunc && make run` 就会看到运行结果。观察程序输出如下: + +```console +main ...... +myfunc_resolver is called +myfunc_1 is called +myfunc returns 101 +myfunc_1 is called +myfunc returns 101 +myfunc_1 is called +myfunc returns 101 +``` + +可见 `myfunc_resolver()` 只会被调用一次,后面显示三次调用 `myfunc()` 直接调用了 `myfunc_1()`。 + +从编写代码的角度来说,详细的请参考 [【参考2】][2] 中针对 `ifunc` 章节的说明。其中特别需要注意的是 resolver 函数的定义方式,摘抄如下: + +> To use this attribute, first define the implementation functions available, and a resolver function that returns a pointer to the selected implementation function. The implementation functions' declarations must match the API of the function being implemented, the resolver's declaration is be a function returning pointer to void function returning void: + +上面的意思是: + +- 首先我们要定义一个 `implementation functions`。这对应于我们例子中的 `myfunc_1()` 和 `myfunc_2()`,这些函数的定义要和我们要实现的函数原型 `int myfunc(int)` 保持一致。同时为让大家深刻理解上面话中后半句的意思,我们例子中特别写了一个和 [【参考2】][2] 上不一样的原型, `int myfunc(int)`,接受一个 int 的参数,返回值是 int 类型。 +- 关键是我们要定义一个 resolver 函数,即我们例子中的 `myfunc_resolver()`。这个函数的参数是 void,此函数的返回值是一个函数指针类型,且这个函数指针所指向的函数原型要符合 `implementation functions` 定义的形式。这个函数的原型声明用 C 语言写起来还是蛮费解的,详细的描述可以参考代码中的注释。 + +# 4. IFUNC 的实现细节分析 + +接下来,我们来看看 GNU IFUNC 的实现细节,这部分需要有一些对于重定位机制的背景知识。 + +在实现上要分两种情况讨论,Preemptible IFUNC 和 Non-preemptible IFUNC。所谓 Preemptible,指的是在一个 ELF 文件格式的 shared object 中,一个 non-local 的 STB_DEFAULT 符号默认为 preemptible(interposable),即运行时可被替换。 + +## 4.1. Preemptible IFUNC + +参考 [ifunc.c](./code/20220621-ifunc/ifunc.c),当我们构建 ifunc.so 时如果定义了 `IFUNC_PREEMPTIBLE` 则 myfunc 这个符号就是 Preemptible,而且又被 ifunc 这个 attribute 所修饰,所以就是我们所谓的 Preemptible IFUNC 场景,等价如下代码: + +```cpp +int myfunc(int) __attribute__((ifunc ("myfunc_resolver"))); +``` + +从链接器的角度来看,Preemptible IFUNC 的处理和常规函数调用没有什么不同。 + +- 【1】链接器在生成的 so 中将 myfunc 这个符号的符号类型定义为 `STT_GNU_IFUNC`,以示和其他普通符号类型 `STT_FUNC` 的区别,这个标识会被加载器或者动态链接器所使用。同时因为在 Preemptible IFUNC 场景下 myfunc 这个符号是外部可见的,所以我们可以使用 `readelf --dyn-syms` 在 `.dynsym` 中看到这个标志为 `STT_GNU_IFUNC` 的 myfunc。同时注意记住其对应的 Value 字段的值是 `00000000000005d6`。这个地址指向谁,我们在后面 【4】中会涉及。 + + ```console + $ riscv64-unknown-linux-gnu-readelf --dyn-syms ifunc.so + + Symbol table '.dynsym' contains 11 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: 00000000000004f0 0 SECTION LOCAL DEFAULT 10 .text + 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterT[...] + 3: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND get_configure + 4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.27 (2) + 5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.27 (2) + 6: 0000000000000000 0 FUNC WEAK DEFAULT UND _[...]@GLIBC_2.27 (2) + 7: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMC[...] + 8: 00000000000005d6 62 FUNC GLOBAL DEFAULT 10 myfunc_resolver + 9: 0000000000000614 76 FUNC GLOBAL DEFAULT 10 test_myfunc + 10: 00000000000005d6 62 IFUNC GLOBAL DEFAULT 10 myfunc + ``` + +- 【2】链接器(ld)为 myfunc 这个符号设置 `R_RISCV_JUMP_SLOT` 重定位条目,我们可以执行 `readelf -r` 命令看一下 GOT 中的重定位项: + + ```console + $ riscv64-unknown-linux-gnu-readelf -r ifunc.so + [略过一些输出] + Relocation section '.rela.plt' at offset 0x428 contains 4 entries: + Offset Info Type Sym. Value Sym. Name + Addend + 000000002018 000300000005 R_RISCV_JUMP_SLOT 0000000000000000 get_configure + 0 + 000000002020 000400000005 R_RISCV_JUMP_SLOT 0000000000000000 puts@GLIBC_2.27 + 0 + 000000002028 000500000005 R_RISCV_JUMP_SLOT 0000000000000000 printf@GLIBC_2.27 + 0 + 000000002030 000a00000005 R_RISCV_JUMP_SLOT myfunc() myfunc + 0 + ``` + +- 【3】链接器(ld)同时为 myfunc 这个函数创建 PLT 条目。我们可以执行 `objdump -d` 命令看一下 myfunc 的 PLT 条目,从反汇编的 ld 指令中可以看到,的确是会从 Relocation section 中的 2030 所对应的内存中加载 myfunc 的地址,而这个地址 2030 就对应着上面的重定位项。现在编译链接阶段的准备工作都做好了,就等加载器和动态链接器上场完成剩下的工作。 + + ```console + $ riscv64-unknown-linux-gnu-objdump -d ifunc.so + ifunc.so: file format elf64-littleriscv + + Disassembly of section .plt: + [略过一些输出] + 00000000000004e0 : + 4e0: 00002e17 auipc t3,0x2 + 4e4: b50e3e03 ld t3,-1200(t3) # 2030 + 4e8: 000e0367 jalr t1,t3 + 4ec: 00000013 nop + ``` + +- 【4】加载程序在运行时会执行动态链接器,因为是 PLT,按照延迟绑定的原理,在第一次调用 `myfunc()` 的时候触发重定位过程,通过检查 `R_RISCV_JUMP_SLOT` 对应的重定位项发现对应的符号 myfunc 的符号类型是 `STT_GNU_IFUNC`。如果是这样,动态链接器就不会简单地像处理 `STT_FUNC` 那样用加载后的实际地址填充 GOT 条目,而是会把 `STT_GNU_IFUNC` 的符号所指向的位址理解成 resolver 函数的地址,它会根据该地址调用这个 resolver 函数,并把该函数返回的结果(也是一个地址),用来做为符号绑定的的地址,并将其放入 GOT 条目中。 + + 再次运行 `objdump -d` 命令,这次我们关注一下 resolver 函数,即例子中的 `myfunc_resolver()` 的地址,正是 00000000000005d6。 + + ```console + $ riscv64-unknown-linux-gnu-objdump -d ifunc.so + [略过一些输出] + 00000000000005d6 : + 5d6: 1141 addi sp,sp,-16 + 5d8: e406 sd ra,8(sp) + 5da: e022 sd s0,0(sp) + [略过一些输出] + ``` + + 所以大家回头可以去看一下 IFUNC 例子的打印输出,我又复制一份在下面。`"myfunc_resolver is called"` 这句话就是动态链接器重定位打印出来的,第一次绑定成功后,`myfunc_resolver()` 返回的地址,譬如这里是 `myfunc_1()` 的地址被填入 GOT,所以后面两次调用 `myfunc()` 就直接执行 `myfunc_1()`,不会再走 `myfunc_resolver()` 的逻辑了。 + + ```console + main ...... + myfunc_resolver is called + myfunc_1 is called + myfunc returns 101 + myfunc_1 is called + myfunc returns 101 + myfunc_1 is called + myfunc returns 101 + ``` + +## 4.2. Non-preemptible IFUNC + +Non-preemptible 的 IFUNC 工作机制和 Preemptible 的稍有不同。首先我们改造一下原来的例子,如果要让 myfunc 这个符号成为 Non-preemptible 的,最简单的方法就是定义 myfunc 为 local 的,即加上关键字 static,如下: + +参考 [ifunc.c](./code/20220621-ifunc/ifunc.c),当我们构建 ifunc.so 时不定义 `IFUNC_PREEMPTIBLE` 则 myfunc 这个符号就是 Non-Preemptible,而且又被 ifunc 这个 attribute 所修饰,所以就是我们所谓的 Non-preemptible IFUNC 场景。代码等同如下: + +```cpp +static int myfunc(int) __attribute__((ifunc ("myfunc_resolver"))); +``` + +我们先关心一下符号表中 myfunc 的信息,由于现在它是一个 local 符号,很容易就猜到我们在 `.dynsym` section 中是看不到这个符号了,执行一下 `readelf --dyn-syms` 验证一下我们的推理: +```console +$ riscv64-unknown-linux-gnu-readelf --dyn-syms ifunc_static.so + +Symbol table '.dynsym' contains 10 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: 00000000000004d0 0 SECTION LOCAL DEFAULT 10 .text + 2: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterT[...] + 3: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND get_configure + 4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.27 (2) + 5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.27 (2) + 6: 0000000000000000 0 FUNC WEAK DEFAULT UND _[...]@GLIBC_2.27 (2) + 7: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMC[...] + 8: 00000000000005f4 76 FUNC GLOBAL DEFAULT 10 test_myfunc + 9: 00000000000005b6 62 FUNC GLOBAL DEFAULT 10 myfunc_resolver +``` + +虽然我们用 `readelf -s` 查看 `.symtab` section 还可以看到 myfunc。 + +```console +$ riscv64-unknown-linux-gnu-readelf -s ifunc_static.so +[略过一些输出] +Symbol table '.symtab' contains 48 entries: + Num: Value Size Type Bind Vis Ndx Name +[略过一些输出] + 31: 00000000000005b6 62 IFUNC LOCAL DEFAULT 10 myfunc +[略过一些输出] +``` +但是需要注意的是:考虑到 `.symtab` 可能会被 strip 掉,那么这会带来一个问题,如果我们还是在重定位表中用 `R_RISCV_JUMP_SLOT` 标识 myfunc,则因为在 `.dynsym` 中无法查询到这是一个 `STT_GNU_IFUNC` 项,这会导致我们在前面描述的绑定过程中的处理逻辑失效,回忆一下我们执行 resolver 的前提是 `R_RISCV_JUMP_SLOT` 和 `STT_GNU_IFUNC` 同时存在。 + +所以为了解决 Non-preemptible 给我们带来的问题,解决的方法是继续改进 ELF,增加一个新的重定位类型 `R_RISCV_IRELATIV`,这个问题就解决了。 + +我们现在来看一下重定位表的内容 +```console +$ riscv64-unknown-linux-gnu-readelf -r ifunc_static.so +[略过一些输出] +Relocation section '.rela.plt' at offset 0x408 contains 4 entries: + Offset Info Type Sym. Value Sym. Name + Addend +000000002018 000300000005 R_RISCV_JUMP_SLOT 0000000000000000 get_configure + 0 +000000002020 000400000005 R_RISCV_JUMP_SLOT 0000000000000000 puts@GLIBC_2.27 + 0 +000000002028 000500000005 R_RISCV_JUMP_SLOT 0000000000000000 printf@GLIBC_2.27 + 0 +000000002030 00000000003a R_RISCV_IRELATIVE 5b6 +``` + +果然这里出现了一项 `R_RISCV_IRELATIVE`,但注意这里对应这项的 Sym. Name 字段显示的并不是 'myfunc',而是 5b6,而这个值正是 `myfunc_resolver()` 函数的地址。之所以要把这个地址直接放在这里道理也很简单,因为在 Non-preemptible 场景下,我们不可能再像 Preemptible 那样从 `.dynsym` 中获取 myfunc 符号对应的 resolver 的地址,所以就把 resolver 的地址直接填写在这里,方便使用。再次运行 `objdump -d` 验证一下,可以看到 5b6 正是 `myfunc_resolver()` 的地址。 + +```console +$ riscv64-unknown-linux-gnu-objdump -d ifunc_static.so +[略过一些输出] +00000000000005b6 : + 5b6: 1141 addi sp,sp,-16 + 5b8: e406 sd ra,8(sp) + 5ba: e022 sd s0,0(sp) +[略过一些输出] +``` + +现在可以总结一下 Non-preemptible 场景下,GNU 工具链又是如何协作完成对 IFUNC 的处理的呢: + +- 【1】链接器在生成的 so 中为 myfunc 这个符号设置 `R_RISCV_IRELATIVE` 重定位条目,考虑到 myfunc 这个符号是一个 local 符号,不可 export 到 `.dynsym` section 中,所以重定位表中 `R_RISCV_IRELATIVE` 直接对应的就是 resolver 的地址。 +- 【2】链接器(ld)同时为 myfunc 这个函数创建 PLT 条目,这个和 Preemptible 场景没啥区别 +- 【3】加载程序在运行时会执行动态链接器,因为是 PLT,按照延迟绑定的原理,在第一次调用 `myfunc()` 的时候触发重定位过程,通过检查 `R_RISCV_IRELATIVE` 对应的重定位项立即知道对应的符号是所谓的 IFUNC 类型,并根据重定位表中存放的 resolver 地址直接计算映射并调用这个 resolver 函数,并把该函数返回的结果(也是一个地址),用来做为符号绑定的的地址,并将其放入 GOT 条目中。 + +## 4.3. 简单总结 + +讲到这里,让我们结合例子来总结整理一下 GNU IFUNC 实现的机制: + +由于必须在运行时由 resolver 函数来决定最终要使用的函数地址,因此在调用 myfunc 时,无论 Preemptible 还是 Non-preemptible,都会利用 GOT 来预留一项重定位项,用来放置 resolver 函数返回的实际函数的地址,之后再以类似 PLT 的机制来运行。 + +而在进行重定位的时候,如果 IFUNC 函数是 Preemptible 的,则会在 `.dynsym` section 中将该函数的符号标识为 `STT_GNU_IFUNC` 并配合传统的 `R_RISCV_JUMP_SLOT` 来进行重定位;如果 IFUNC 函数是 Non-preemptible 的,则直接标识为 `R_RISCV_IRELATIVE` 方式进行重定位。以上两种情况下的重定位的过程和传统的重定位不同,不是简单地绑定符号映射的地址,而是将符号映射的地址理解为 resolver 的函数地址并根据该地址调用这个 resolver 函数,同时把该函数返回的结果(实际最终选择的地址),用来和符号进行绑定。 + + + +[1]: https://sourceware.org/glibc/wiki/GNU_IFUNC +[2]: https://gcc.gnu.org/onlinedocs/gcc-11.3.0/gcc/Common-Function-Attributes.html#Common-Function-Attributes +[3]: https://alittleresearcher.blogspot.com/2017/04/gnu-indirect-function-mechanism.html +[4]: ./code/20220621-ifunc/ +[5]: http://maskray.me/blog/2021-01-18-gnu-indirect-function diff --git a/articles/code/20220621-ifunc/Makefile b/articles/code/20220621-ifunc/Makefile new file mode 100644 index 0000000..175cda2 --- /dev/null +++ b/articles/code/20220621-ifunc/Makefile @@ -0,0 +1,25 @@ +CROSS_COMPILE = riscv64-unknown-linux-gnu- + +MY_CONFIG ?= 1 + +.DEFAULT_GOAL := all + +no-ifunc: clean + ${CROSS_COMPILE}gcc -g -shared -fPIC no_ifunc.c -o no_ifunc.so + ${CROSS_COMPILE}gcc -g -DMY_CONFIG=${MY_CONFIG} main.c no_ifunc.so -o a.out + +ifunc: clean + ${CROSS_COMPILE}gcc -g -shared -fPIC -DIFUNC_PREEMPTIBLE ifunc.c -o ifunc.so + ${CROSS_COMPILE}gcc -g -DMY_CONFIG=${MY_CONFIG} main.c ifunc.so -o a.out + +ifunc-static: clean + ${CROSS_COMPILE}gcc -g -shared -fPIC ifunc.c -o ifunc_static.so + ${CROSS_COMPILE}gcc -g -DMY_CONFIG=${MY_CONFIG} main.c ifunc_static.so -o a.out + +.PHONY : clean +clean: + rm -rf *.so a.out + +.PHONY : run +run: + @qemu-riscv64 -L /home/u/ws/test-gcc/install/sysroot/ -E LD_LIBRARY_PATH=. ./a.out diff --git a/articles/code/20220621-ifunc/ifunc.c b/articles/code/20220621-ifunc/ifunc.c new file mode 100644 index 0000000..fe4537b --- /dev/null +++ b/articles/code/20220621-ifunc/ifunc.c @@ -0,0 +1,46 @@ +#include +#include +#include + +extern int get_configure(void); + +static int myfunc_1 (int a) +{ + printf("myfunc_1 is called\n"); + return a + 100; +} + +static int myfunc_2 (int a){ + printf("myfunc_2 is called\n"); + return a + 200; +} + +#ifndef IFUNC_PREEMPTIBLE +static +#endif +int myfunc(int) __attribute__((ifunc ("myfunc_resolver"))); + +// myfunc_resolver -- a symbol to +// myfunc_resolver(void) -- a function taking no arguments +// *myfunc_resolver(void) -- and returning a pointer +// (*myfunc_resolver(void)) (int) -- to a function taking an argument of int +// int (*myfunc_resolver(void)) (int) -- and returning int +// static int (*myfunc_resolver(void)) (int) -- and is not exported to the linker +// so myfunc_resolver, as a function itself, with no argument, will return +// a pointer to a function, which protype is "int func(int)" +int (*myfunc_resolver(void))(int) +{ + printf("myfunc_resolver is called\n"); + if (1 == get_configure()) { + return myfunc_1; + } else { + return myfunc_2; + } +} + +void test_myfunc() +{ + for (int i = 0; i < 3; i++) { + printf("myfunc returns %d\n", myfunc(1)); + } +} diff --git a/articles/code/20220621-ifunc/main.c b/articles/code/20220621-ifunc/main.c new file mode 100644 index 0000000..ec6d332 --- /dev/null +++ b/articles/code/20220621-ifunc/main.c @@ -0,0 +1,21 @@ +#include + +extern void test_myfunc(); + +#ifndef MY_CONFIG +#define MY_CONFIG 1 +#endif + +static int g_configure = MY_CONFIG; + +int get_configure() +{ + return g_configure; +} + +int main() +{ + printf("main ......\n"); + test_myfunc(); + return 0; +} \ No newline at end of file diff --git a/articles/code/20220621-ifunc/no_ifunc.c b/articles/code/20220621-ifunc/no_ifunc.c new file mode 100644 index 0000000..5ed4842 --- /dev/null +++ b/articles/code/20220621-ifunc/no_ifunc.c @@ -0,0 +1,33 @@ +#include +#include +#include + +extern int get_configure(void); + +static int myfunc_1 (int a) +{ + printf("myfunc_1 is called\n"); + return a + 100; +} + +static int myfunc_2 (int a){ + printf("myfunc_2 is called\n"); + return a + 200; +} + +int myfunc(int a) +{ + printf("myfunc is called\n"); + if (1 == get_configure()) { + return myfunc_1(a); + } else { + return myfunc_2(a); + } +} + +void test_myfunc() +{ + for (int i = 0; i < 3; i++) { + printf("myfunc returns %d\n", myfunc(1)); + } +} diff --git a/articles/diagrams/linker-loader.png b/articles/diagrams/linker-loader.png new file mode 100644 index 0000000000000000000000000000000000000000..8dda798f630694c1428549074f8ac9911eb5e38b GIT binary patch literal 67644 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�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 Tr8(Qrz>l1?vQ(vnalrot_Tn*p literal 0 HcmV?d00001 -- Gitee