Weak Symbol

Table of Contents

1. Weak Symbol

1.1. weak 有默认值

loader 在处理 weak_symbol 时, 即使没有找到任何非 UNDEF 的符号, 也不会报错, 由于 loader 对这个符号跳过了 reloate, 所以符号的值会使用 got 中默认的 0 值, 所以如下的代码可以用来判断是否有 strong symbol 定义.

if (weak_symbol == 0) {
  /* no strong version */
}
extern int xxx __attribute__((weak));
int main(int argc, char *argv[]) {
  printf("%x\n", &xxx);
  return 0;
}
$> arm-linux-androideabi-gcc test.c -O0 -g3
$> readelf -a ./a.out

Relocation section '.rel.dyn' at offset 0x318 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00009fe4  00000415 R_ARM_GLOB_DAT    00000000   xxx
~~~~~~~~ <-- got 位置

Symbol table '.dynsym' contains 8 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     ...
     4: 00000000     0 NOTYPE  WEAK   DEFAULT  UND xxx
     ...

$> objdump -D ./a.out

Disassembly of section .got:

00009fd0 <_GLOBAL_OFFSET_TABLE_-0x18>:
    9fd0:	00009ec8 	andeq	r9, r0, r8, asr #29
    9fd4:	00009eb8 			; <UNDEFINED> instruction: 0x00009eb8
    9fd8:	00009eb0 			; <UNDEFINED> instruction: 0x00009eb0
    9fdc:	00009ec0 	andeq	r9, r0, r0, asr #29
    9fe0:	00008418 	andeq	r8, r0, r8, lsl r4
    9fe4:	00000000 	andeq	r0, r0, r0          <--------- weak symbol 默认值为 0

$> ./a.out
0

1.2. weak symbol 与 rtld

看起来 linux 的 rtld 并不会考虑 weak symbol, 而 android 的 rtld 会考虑

Backlinks

GCC Attribute (GCC Attribute > weak): weak

Author: [email protected]
Date: 2020-11-12 Thu 00:00
Last updated: 2022-03-29 Tue 12:09

知识共享许可协议