xref: /OK3568_Linux_fs/kernel/Documentation/livepatch/module-elf-format.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun===========================
2*4882a593SmuzhiyunLivepatch module Elf format
3*4882a593Smuzhiyun===========================
4*4882a593Smuzhiyun
5*4882a593SmuzhiyunThis document outlines the Elf format requirements that livepatch modules must follow.
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun.. Table of Contents
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun   1. Background and motivation
11*4882a593Smuzhiyun   2. Livepatch modinfo field
12*4882a593Smuzhiyun   3. Livepatch relocation sections
13*4882a593Smuzhiyun      3.1 Livepatch relocation section format
14*4882a593Smuzhiyun   4. Livepatch symbols
15*4882a593Smuzhiyun      4.1 A livepatch module's symbol table
16*4882a593Smuzhiyun      4.2 Livepatch symbol format
17*4882a593Smuzhiyun   5. Symbol table and Elf section access
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun1. Background and motivation
20*4882a593Smuzhiyun============================
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunFormerly, livepatch required separate architecture-specific code to write
23*4882a593Smuzhiyunrelocations. However, arch-specific code to write relocations already
24*4882a593Smuzhiyunexists in the module loader, so this former approach produced redundant
25*4882a593Smuzhiyuncode. So, instead of duplicating code and re-implementing what the module
26*4882a593Smuzhiyunloader can already do, livepatch leverages existing code in the module
27*4882a593Smuzhiyunloader to perform the all the arch-specific relocation work. Specifically,
28*4882a593Smuzhiyunlivepatch reuses the apply_relocate_add() function in the module loader to
29*4882a593Smuzhiyunwrite relocations. The patch module Elf format described in this document
30*4882a593Smuzhiyunenables livepatch to be able to do this. The hope is that this will make
31*4882a593Smuzhiyunlivepatch more easily portable to other architectures and reduce the amount
32*4882a593Smuzhiyunof arch-specific code required to port livepatch to a particular
33*4882a593Smuzhiyunarchitecture.
34*4882a593Smuzhiyun
35*4882a593SmuzhiyunSince apply_relocate_add() requires access to a module's section header
36*4882a593Smuzhiyuntable, symbol table, and relocation section indices, Elf information is
37*4882a593Smuzhiyunpreserved for livepatch modules (see section 5). Livepatch manages its own
38*4882a593Smuzhiyunrelocation sections and symbols, which are described in this document. The
39*4882a593SmuzhiyunElf constants used to mark livepatch symbols and relocation sections were
40*4882a593Smuzhiyunselected from OS-specific ranges according to the definitions from glibc.
41*4882a593Smuzhiyun
42*4882a593SmuzhiyunWhy does livepatch need to write its own relocations?
43*4882a593Smuzhiyun-----------------------------------------------------
44*4882a593SmuzhiyunA typical livepatch module contains patched versions of functions that can
45*4882a593Smuzhiyunreference non-exported global symbols and non-included local symbols.
46*4882a593SmuzhiyunRelocations referencing these types of symbols cannot be left in as-is
47*4882a593Smuzhiyunsince the kernel module loader cannot resolve them and will therefore
48*4882a593Smuzhiyunreject the livepatch module. Furthermore, we cannot apply relocations that
49*4882a593Smuzhiyunaffect modules not yet loaded at patch module load time (e.g. a patch to a
50*4882a593Smuzhiyundriver that is not loaded). Formerly, livepatch solved this problem by
51*4882a593Smuzhiyunembedding special "dynrela" (dynamic rela) sections in the resulting patch
52*4882a593Smuzhiyunmodule Elf output. Using these dynrela sections, livepatch could resolve
53*4882a593Smuzhiyunsymbols while taking into account its scope and what module the symbol
54*4882a593Smuzhiyunbelongs to, and then manually apply the dynamic relocations. However this
55*4882a593Smuzhiyunapproach required livepatch to supply arch-specific code in order to write
56*4882a593Smuzhiyunthese relocations. In the new format, livepatch manages its own SHT_RELA
57*4882a593Smuzhiyunrelocation sections in place of dynrela sections, and the symbols that the
58*4882a593Smuzhiyunrelas reference are special livepatch symbols (see section 2 and 3). The
59*4882a593Smuzhiyunarch-specific livepatch relocation code is replaced by a call to
60*4882a593Smuzhiyunapply_relocate_add().
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun2. Livepatch modinfo field
63*4882a593Smuzhiyun==========================
64*4882a593Smuzhiyun
65*4882a593SmuzhiyunLivepatch modules are required to have the "livepatch" modinfo attribute.
66*4882a593SmuzhiyunSee the sample livepatch module in samples/livepatch/ for how this is done.
67*4882a593Smuzhiyun
68*4882a593SmuzhiyunLivepatch modules can be identified by users by using the 'modinfo' command
69*4882a593Smuzhiyunand looking for the presence of the "livepatch" field. This field is also
70*4882a593Smuzhiyunused by the kernel module loader to identify livepatch modules.
71*4882a593Smuzhiyun
72*4882a593SmuzhiyunExample:
73*4882a593Smuzhiyun--------
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun**Modinfo output:**
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun::
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun	% modinfo livepatch-meminfo.ko
80*4882a593Smuzhiyun	filename:		livepatch-meminfo.ko
81*4882a593Smuzhiyun	livepatch:		Y
82*4882a593Smuzhiyun	license:		GPL
83*4882a593Smuzhiyun	depends:
84*4882a593Smuzhiyun	vermagic:		4.3.0+ SMP mod_unload
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun3. Livepatch relocation sections
87*4882a593Smuzhiyun================================
88*4882a593Smuzhiyun
89*4882a593SmuzhiyunA livepatch module manages its own Elf relocation sections to apply
90*4882a593Smuzhiyunrelocations to modules as well as to the kernel (vmlinux) at the
91*4882a593Smuzhiyunappropriate time. For example, if a patch module patches a driver that is
92*4882a593Smuzhiyunnot currently loaded, livepatch will apply the corresponding livepatch
93*4882a593Smuzhiyunrelocation section(s) to the driver once it loads.
94*4882a593Smuzhiyun
95*4882a593SmuzhiyunEach "object" (e.g. vmlinux, or a module) within a patch module may have
96*4882a593Smuzhiyunmultiple livepatch relocation sections associated with it (e.g. patches to
97*4882a593Smuzhiyunmultiple functions within the same object). There is a 1-1 correspondence
98*4882a593Smuzhiyunbetween a livepatch relocation section and the target section (usually the
99*4882a593Smuzhiyuntext section of a function) to which the relocation(s) apply. It is
100*4882a593Smuzhiyunalso possible for a livepatch module to have no livepatch relocation
101*4882a593Smuzhiyunsections, as in the case of the sample livepatch module (see
102*4882a593Smuzhiyunsamples/livepatch).
103*4882a593Smuzhiyun
104*4882a593SmuzhiyunSince Elf information is preserved for livepatch modules (see Section 5), a
105*4882a593Smuzhiyunlivepatch relocation section can be applied simply by passing in the
106*4882a593Smuzhiyunappropriate section index to apply_relocate_add(), which then uses it to
107*4882a593Smuzhiyunaccess the relocation section and apply the relocations.
108*4882a593Smuzhiyun
109*4882a593SmuzhiyunEvery symbol referenced by a rela in a livepatch relocation section is a
110*4882a593Smuzhiyunlivepatch symbol. These must be resolved before livepatch can call
111*4882a593Smuzhiyunapply_relocate_add(). See Section 3 for more information.
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun3.1 Livepatch relocation section format
114*4882a593Smuzhiyun=======================================
115*4882a593Smuzhiyun
116*4882a593SmuzhiyunLivepatch relocation sections must be marked with the SHF_RELA_LIVEPATCH
117*4882a593Smuzhiyunsection flag. See include/uapi/linux/elf.h for the definition. The module
118*4882a593Smuzhiyunloader recognizes this flag and will avoid applying those relocation sections
119*4882a593Smuzhiyunat patch module load time. These sections must also be marked with SHF_ALLOC,
120*4882a593Smuzhiyunso that the module loader doesn't discard them on module load (i.e. they will
121*4882a593Smuzhiyunbe copied into memory along with the other SHF_ALLOC sections).
122*4882a593Smuzhiyun
123*4882a593SmuzhiyunThe name of a livepatch relocation section must conform to the following
124*4882a593Smuzhiyunformat::
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun  .klp.rela.objname.section_name
127*4882a593Smuzhiyun  ^        ^^     ^ ^          ^
128*4882a593Smuzhiyun  |________||_____| |__________|
129*4882a593Smuzhiyun     [A]      [B]        [C]
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun[A]
132*4882a593Smuzhiyun  The relocation section name is prefixed with the string ".klp.rela."
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun[B]
135*4882a593Smuzhiyun  The name of the object (i.e. "vmlinux" or name of module) to
136*4882a593Smuzhiyun  which the relocation section belongs follows immediately after the prefix.
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun[C]
139*4882a593Smuzhiyun  The actual name of the section to which this relocation section applies.
140*4882a593Smuzhiyun
141*4882a593SmuzhiyunExamples:
142*4882a593Smuzhiyun---------
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun**Livepatch relocation section names:**
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun::
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun  .klp.rela.ext4.text.ext4_attr_store
149*4882a593Smuzhiyun  .klp.rela.vmlinux.text.cmdline_proc_show
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun**`readelf --sections` output for a patch
152*4882a593Smuzhiyunmodule that patches vmlinux and modules 9p, btrfs, ext4:**
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun::
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun  Section Headers:
157*4882a593Smuzhiyun  [Nr] Name                          Type                    Address          Off    Size   ES Flg Lk Inf Al
158*4882a593Smuzhiyun  [ snip ]
159*4882a593Smuzhiyun  [29] .klp.rela.9p.text.caches.show RELA                    0000000000000000 002d58 0000c0 18 AIo 64   9  8
160*4882a593Smuzhiyun  [30] .klp.rela.btrfs.text.btrfs.feature.attr.show RELA     0000000000000000 002e18 000060 18 AIo 64  11  8
161*4882a593Smuzhiyun  [ snip ]
162*4882a593Smuzhiyun  [34] .klp.rela.ext4.text.ext4.attr.store RELA              0000000000000000 002fd8 0000d8 18 AIo 64  13  8
163*4882a593Smuzhiyun  [35] .klp.rela.ext4.text.ext4.attr.show RELA               0000000000000000 0030b0 000150 18 AIo 64  15  8
164*4882a593Smuzhiyun  [36] .klp.rela.vmlinux.text.cmdline.proc.show RELA         0000000000000000 003200 000018 18 AIo 64  17  8
165*4882a593Smuzhiyun  [37] .klp.rela.vmlinux.text.meminfo.proc.show RELA         0000000000000000 003218 0000f0 18 AIo 64  19  8
166*4882a593Smuzhiyun  [ snip ]                                       ^                                             ^
167*4882a593Smuzhiyun                                                 |                                             |
168*4882a593Smuzhiyun                                                [*]                                           [*]
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun[*]
171*4882a593Smuzhiyun  Livepatch relocation sections are SHT_RELA sections but with a few special
172*4882a593Smuzhiyun  characteristics. Notice that they are marked SHF_ALLOC ("A") so that they will
173*4882a593Smuzhiyun  not be discarded when the module is loaded into memory, as well as with the
174*4882a593Smuzhiyun  SHF_RELA_LIVEPATCH flag ("o" - for OS-specific).
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun**`readelf --relocs` output for a patch module:**
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun::
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun  Relocation section '.klp.rela.btrfs.text.btrfs_feature_attr_show' at offset 0x2ba0 contains 4 entries:
181*4882a593Smuzhiyun      Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
182*4882a593Smuzhiyun  000000000000001f  0000005e00000002 R_X86_64_PC32          0000000000000000 .klp.sym.vmlinux.printk,0 - 4
183*4882a593Smuzhiyun  0000000000000028  0000003d0000000b R_X86_64_32S           0000000000000000 .klp.sym.btrfs.btrfs_ktype,0 + 0
184*4882a593Smuzhiyun  0000000000000036  0000003b00000002 R_X86_64_PC32          0000000000000000 .klp.sym.btrfs.can_modify_feature.isra.3,0 - 4
185*4882a593Smuzhiyun  000000000000004c  0000004900000002 R_X86_64_PC32          0000000000000000 .klp.sym.vmlinux.snprintf,0 - 4
186*4882a593Smuzhiyun  [ snip ]                                                                   ^
187*4882a593Smuzhiyun                                                                             |
188*4882a593Smuzhiyun                                                                            [*]
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun[*]
191*4882a593Smuzhiyun  Every symbol referenced by a relocation is a livepatch symbol.
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun4. Livepatch symbols
194*4882a593Smuzhiyun====================
195*4882a593Smuzhiyun
196*4882a593SmuzhiyunLivepatch symbols are symbols referred to by livepatch relocation sections.
197*4882a593SmuzhiyunThese are symbols accessed from new versions of functions for patched
198*4882a593Smuzhiyunobjects, whose addresses cannot be resolved by the module loader (because
199*4882a593Smuzhiyunthey are local or unexported global syms). Since the module loader only
200*4882a593Smuzhiyunresolves exported syms, and not every symbol referenced by the new patched
201*4882a593Smuzhiyunfunctions is exported, livepatch symbols were introduced. They are used
202*4882a593Smuzhiyunalso in cases where we cannot immediately know the address of a symbol when
203*4882a593Smuzhiyuna patch module loads. For example, this is the case when livepatch patches
204*4882a593Smuzhiyuna module that is not loaded yet. In this case, the relevant livepatch
205*4882a593Smuzhiyunsymbols are resolved simply when the target module loads. In any case, for
206*4882a593Smuzhiyunany livepatch relocation section, all livepatch symbols referenced by that
207*4882a593Smuzhiyunsection must be resolved before livepatch can call apply_relocate_add() for
208*4882a593Smuzhiyunthat reloc section.
209*4882a593Smuzhiyun
210*4882a593SmuzhiyunLivepatch symbols must be marked with SHN_LIVEPATCH so that the module
211*4882a593Smuzhiyunloader can identify and ignore them. Livepatch modules keep these symbols
212*4882a593Smuzhiyunin their symbol tables, and the symbol table is made accessible through
213*4882a593Smuzhiyunmodule->symtab.
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun4.1 A livepatch module's symbol table
216*4882a593Smuzhiyun=====================================
217*4882a593SmuzhiyunNormally, a stripped down copy of a module's symbol table (containing only
218*4882a593Smuzhiyun"core" symbols) is made available through module->symtab (See layout_symtab()
219*4882a593Smuzhiyunin kernel/module.c). For livepatch modules, the symbol table copied into memory
220*4882a593Smuzhiyunon module load must be exactly the same as the symbol table produced when the
221*4882a593Smuzhiyunpatch module was compiled. This is because the relocations in each livepatch
222*4882a593Smuzhiyunrelocation section refer to their respective symbols with their symbol indices,
223*4882a593Smuzhiyunand the original symbol indices (and thus the symtab ordering) must be
224*4882a593Smuzhiyunpreserved in order for apply_relocate_add() to find the right symbol.
225*4882a593Smuzhiyun
226*4882a593SmuzhiyunFor example, take this particular rela from a livepatch module:::
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun  Relocation section '.klp.rela.btrfs.text.btrfs_feature_attr_show' at offset 0x2ba0 contains 4 entries:
229*4882a593Smuzhiyun      Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
230*4882a593Smuzhiyun  000000000000001f  0000005e00000002 R_X86_64_PC32          0000000000000000 .klp.sym.vmlinux.printk,0 - 4
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun  This rela refers to the symbol '.klp.sym.vmlinux.printk,0', and the symbol index is encoded
233*4882a593Smuzhiyun  in 'Info'. Here its symbol index is 0x5e, which is 94 in decimal, which refers to the
234*4882a593Smuzhiyun  symbol index 94.
235*4882a593Smuzhiyun  And in this patch module's corresponding symbol table, symbol index 94 refers to that very symbol:
236*4882a593Smuzhiyun  [ snip ]
237*4882a593Smuzhiyun  94: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT OS [0xff20] .klp.sym.vmlinux.printk,0
238*4882a593Smuzhiyun  [ snip ]
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun4.2 Livepatch symbol format
241*4882a593Smuzhiyun===========================
242*4882a593Smuzhiyun
243*4882a593SmuzhiyunLivepatch symbols must have their section index marked as SHN_LIVEPATCH, so
244*4882a593Smuzhiyunthat the module loader can identify them and not attempt to resolve them.
245*4882a593SmuzhiyunSee include/uapi/linux/elf.h for the actual definitions.
246*4882a593Smuzhiyun
247*4882a593SmuzhiyunLivepatch symbol names must conform to the following format::
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun  .klp.sym.objname.symbol_name,sympos
250*4882a593Smuzhiyun  ^       ^^     ^ ^         ^ ^
251*4882a593Smuzhiyun  |_______||_____| |_________| |
252*4882a593Smuzhiyun     [A]     [B]       [C]    [D]
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun[A]
255*4882a593Smuzhiyun  The symbol name is prefixed with the string ".klp.sym."
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun[B]
258*4882a593Smuzhiyun  The name of the object (i.e. "vmlinux" or name of module) to
259*4882a593Smuzhiyun  which the symbol belongs follows immediately after the prefix.
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun[C]
262*4882a593Smuzhiyun  The actual name of the symbol.
263*4882a593Smuzhiyun
264*4882a593Smuzhiyun[D]
265*4882a593Smuzhiyun  The position of the symbol in the object (as according to kallsyms)
266*4882a593Smuzhiyun  This is used to differentiate duplicate symbols within the same
267*4882a593Smuzhiyun  object. The symbol position is expressed numerically (0, 1, 2...).
268*4882a593Smuzhiyun  The symbol position of a unique symbol is 0.
269*4882a593Smuzhiyun
270*4882a593SmuzhiyunExamples:
271*4882a593Smuzhiyun---------
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun**Livepatch symbol names:**
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun::
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun	.klp.sym.vmlinux.snprintf,0
278*4882a593Smuzhiyun	.klp.sym.vmlinux.printk,0
279*4882a593Smuzhiyun	.klp.sym.btrfs.btrfs_ktype,0
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun**`readelf --symbols` output for a patch module:**
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun::
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun  Symbol table '.symtab' contains 127 entries:
286*4882a593Smuzhiyun     Num:    Value          Size Type    Bind   Vis     Ndx         Name
287*4882a593Smuzhiyun     [ snip ]
288*4882a593Smuzhiyun      73: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT OS [0xff20] .klp.sym.vmlinux.snprintf,0
289*4882a593Smuzhiyun      74: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT OS [0xff20] .klp.sym.vmlinux.capable,0
290*4882a593Smuzhiyun      75: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT OS [0xff20] .klp.sym.vmlinux.find_next_bit,0
291*4882a593Smuzhiyun      76: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT OS [0xff20] .klp.sym.vmlinux.si_swapinfo,0
292*4882a593Smuzhiyun    [ snip ]                                               ^
293*4882a593Smuzhiyun                                                           |
294*4882a593Smuzhiyun                                                          [*]
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun[*]
297*4882a593Smuzhiyun  Note that the 'Ndx' (Section index) for these symbols is SHN_LIVEPATCH (0xff20).
298*4882a593Smuzhiyun  "OS" means OS-specific.
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun5. Symbol table and Elf section access
301*4882a593Smuzhiyun======================================
302*4882a593SmuzhiyunA livepatch module's symbol table is accessible through module->symtab.
303*4882a593Smuzhiyun
304*4882a593SmuzhiyunSince apply_relocate_add() requires access to a module's section headers,
305*4882a593Smuzhiyunsymbol table, and relocation section indices, Elf information is preserved for
306*4882a593Smuzhiyunlivepatch modules and is made accessible by the module loader through
307*4882a593Smuzhiyunmodule->klp_info, which is a klp_modinfo struct. When a livepatch module loads,
308*4882a593Smuzhiyunthis struct is filled in by the module loader. Its fields are documented below::
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun	struct klp_modinfo {
311*4882a593Smuzhiyun		Elf_Ehdr hdr; /* Elf header */
312*4882a593Smuzhiyun		Elf_Shdr *sechdrs; /* Section header table */
313*4882a593Smuzhiyun		char *secstrings; /* String table for the section headers */
314*4882a593Smuzhiyun		unsigned int symndx; /* The symbol table section index */
315*4882a593Smuzhiyun	};
316