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