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