1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, this CDDL HEADER in each 14 * file and the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 #include <memory.h> 27 #include <libelf.h> 28 #include <link.h> 29 #include <sys/elf_SPARC.h> 30 #include <sys/elf_amd64.h> 31 #include <decl.h> 32 #include <msg.h> 33 #include <sgs.h> 34 #include <stddef.h> 35 36 /* 37 * fmsize: Array used to determine what size the the structures 38 * are (for memory image & file image). 39 * 40 * x64: Translation routines - to file & to memory. 41 * 42 * What must be done when adding a new type for conversion: 43 * 44 * The first question is whether you need a new ELF_T_* type 45 * to be created. If you've introduced a new structure - then 46 * it will need to be described - this is done by: 47 * 48 * o adding a new type ELF_T_* to usr/src/head/libelf.h 49 * o Create a new macro to the bytes contained in the structure. Take a 50 * look at the 'Syminfo_1' macro defined below. The declarations describe 51 * the structure based off of the field size of each element of the structure. 52 * o Add a entry to the fmsize table for the new ELF_T_* type. 53 * o Create a <newtype>_11_tof macro. Take a look at 'syminfo_11_tof'. 54 * o Create a <newtype>_11_tom macro. Take a look at 'syminfo_11_tom'. 55 * o The <newtype>_11_tof & <newtype>_11_tom results in conversion routines 56 * <newtype>_2L11_tof, <newtype>_2L11_tom, <newtype>_2M11_tof, 57 * <newtype>_2M11_tom being created in xlate.c. These routines 58 * need to be added to the 'x64[]' array. 59 * o Add entries to getdata.c::align32[] and getdata.c::align64[]. These 60 * tables what the alignment requirements for a data type are. 61 * 62 * In order to tie a section header type (SHT_*) to a data 63 * structure you need to update elf64_mtype() so that it can 64 * make the association. If you are introducing a new section built 65 * on a basic datatype (SHT_INIT_ARRAY) then this is all the updating 66 * that needs to be done. 67 * 68 * 69 * ELF translation routines 70 * 71 * These routines make a subtle implicit assumption. 72 * The file representations of all structures are "packed," 73 * meaning no implicit padding bytes occur. This might not 74 * be the case for the memory representations. Consequently, 75 * the memory representations ALWAYS contain at least as many 76 * bytes as the file representations. Otherwise, the memory 77 * structures would lose information, meaning they're not 78 * implemented properly. 79 * 80 * The words above apply to structures with the same members. 81 * If a future version changes the number of members, the 82 * relative structure sizes for different version must be 83 * tested with the compiler. 84 */ 85 86 #define HI32 0x80000000UL 87 #define LO31 0x7fffffffUL 88 89 #define HI64 0x8000000000000000ULL 90 #define LO63 0x7fffffffffffffffULL 91 92 /* 93 * These macros create indexes for accessing the bytes of 94 * words and halfwords for ELFCLASS64 data representations 95 * (currently ELFDATA2LSB and ELFDATA2MSB). In all cases, 96 * 97 * x = ((((((((((((X_7 << 8) + X_6) << 8) + X_5) << 8) + X_4) << 8 98 * + X_3) << 8) + X_2) << 8) + X_1) << 8) + X_0 99 * w = (((((X_3 << 8) + X_2) << 8) + X_1) << 8) + X_0 100 * h = (X_1 << 8) + X_0 101 * 102 * These assume the file representations for Addr, Off, 103 * Sword, and Word use 4 bytes, but the memory def's for 104 * the types may differ. 105 * 106 * Naming convention: 107 * ..._L ELFDATA2LSB 108 * ..._M ELFDATA2MSB 109 * 110 * enuma_*(n) enum names for addr n 111 * enumb_*(n) enum names for byte n 112 * enumh_*(n) enum names for half n 113 * enumo_*(n) enum names for off n 114 * enumw_*(n) enum names for word n 115 * enumx_*(n) enum names for xword n 116 * enuml_*(n) enum names for Lword n 117 * tofa(d,s,n) xlate addr n from mem s to file d 118 * tofb(d,s,n) xlate byte n from mem s to file d 119 * tofh(d,s,n) xlate half n from mem s to file d 120 * tofo(d,s,n) xlate off n from mem s to file d 121 * tofw(d,s,n) xlate word n from mem s to file d 122 * tofx(d,s,n) xlate xword n from mem s to file d 123 * tofl(d,s,n) xlate Lword n from mem s to file d 124 * toma(s,n) xlate addr n from file s to expression value 125 * tomb(s,n) xlate byte n from file s to expression value 126 * tomh(s,n) xlate half n from file s to expression value 127 * tomo(s,n) xlate off n from file s to expression value 128 * tomw(s,n) xlate word n from file s to expression value 129 * tomx(s,n) xlate xword n from file s to expression value 130 * toml(s,n) xlate Lword n from file s to expression value 131 * 132 * tof*() macros must move a multi-byte value into a temporary 133 * because `in place' conversions are allowed. If a temp is not 134 * used for multi-byte objects, storing an initial destination byte 135 * may clobber a source byte not yet examined. 136 * 137 * tom*() macros compute an expression value from the source 138 * without touching the destination; so they're safe. 139 */ 140 141 142 143 144 145 /* 146 * ELF data object indexes 147 * The enums are broken apart to get around deficiencies 148 * in some compilers. 149 */ 150 151 152 153 154 enum 155 { 156 A_L0, A_L1, A_L2, A_L3, A_L4, A_L5, A_L6, A_L7 157 }; 158 159 enum 160 { 161 A_M7, A_M6, A_M5, A_M4, A_M3, A_M2, A_M1, A_M0, 162 A_sizeof 163 }; 164 165 166 167 168 169 enum 170 { 171 H_L0, H_L1 172 }; 173 174 enum 175 { 176 H_M1, H_M0, 177 H_sizeof 178 }; 179 180 181 182 183 enum 184 { 185 L_L0, L_L1, L_L2, L_L3, L_L4, L_L5, L_L6, L_L7 186 }; 187 188 enum 189 { 190 L_M7, L_M6, L_M5, L_M4, L_M3, L_M2, L_M1, L_M0, 191 L_sizeof 192 }; 193 194 195 196 197 enum 198 { 199 M1_value_L0, M1_value_L1, M1_value_L2, M1_value_L3, M1_value_L4, M1_value_L5, M1_value_L6, M1_value_L7, 200 M1_info_L0, M1_info_L1, M1_info_L2, M1_info_L3, M1_info_L4, M1_info_L5, M1_info_L6, M1_info_L7, 201 M1_poffset_L0, M1_poffset_L1, M1_poffset_L2, M1_poffset_L3, M1_poffset_L4, M1_poffset_L5, M1_poffset_L6, M1_poffset_L7, 202 M1_repeat_L0, M1_repeat_L1, 203 M1_stride_L0, M1_stride_L1 204 }; 205 206 enum 207 { 208 M1_value_M7, M1_value_M6, M1_value_M5, M1_value_M4, M1_value_M3, M1_value_M2, M1_value_M1, M1_value_M0, 209 M1_info_M7, M1_info_M6, M1_info_M5, M1_info_M4, M1_info_M3, M1_info_M2, M1_info_M1, M1_info_M0, 210 M1_poffset_M7, M1_poffset_M6, M1_poffset_M5, M1_poffset_M4, M1_poffset_M3, M1_poffset_M2, M1_poffset_M1, M1_poffset_M0, 211 M1_repeat_M1, M1_repeat_M0, 212 M1_stride_M1, M1_stride_M0, 213 M1_sizeof 214 }; 215 216 217 218 219 220 enum 221 { 222 MP1_value_L0, MP1_value_L1, MP1_value_L2, MP1_value_L3, MP1_value_L4, MP1_value_L5, MP1_value_L6, MP1_value_L7, 223 MP1_info_L0, MP1_info_L1, MP1_info_L2, MP1_info_L3, MP1_info_L4, MP1_info_L5, MP1_info_L6, MP1_info_L7, 224 MP1_poffset_L0, MP1_poffset_L1, MP1_poffset_L2, MP1_poffset_L3, MP1_poffset_L4, MP1_poffset_L5, MP1_poffset_L6, MP1_poffset_L7, 225 MP1_repeat_L0, MP1_repeat_L1, 226 MP1_stride_L0, MP1_stride_L1, 227 MP1_padding_L0, MP1_padding_L1, MP1_padding_L2, MP1_padding_L3 228 }; 229 230 enum 231 { 232 MP1_value_M7, MP1_value_M6, MP1_value_M5, MP1_value_M4, MP1_value_M3, MP1_value_M2, MP1_value_M1, MP1_value_M0, 233 MP1_info_M7, MP1_info_M6, MP1_info_M5, MP1_info_M4, MP1_info_M3, MP1_info_M2, MP1_info_M1, MP1_info_M0, 234 MP1_poffset_M7, MP1_poffset_M6, MP1_poffset_M5, MP1_poffset_M4, MP1_poffset_M3, MP1_poffset_M2, MP1_poffset_M1, MP1_poffset_M0, 235 MP1_repeat_M1, MP1_repeat_M0, 236 MP1_stride_M1, MP1_stride_M0, 237 MP1_padding_M3, MP1_padding_M2, MP1_padding_M1, MP1_padding_M0, 238 MP1_sizeof 239 }; 240 241 242 243 244 245 enum 246 { 247 O_L0, O_L1, O_L2, O_L3, O_L4, O_L5, O_L6, O_L7 248 }; 249 250 enum 251 { 252 O_M7, O_M6, O_M5, O_M4, O_M3, O_M2, O_M1, O_M0, 253 O_sizeof 254 }; 255 256 257 258 259 260 enum 261 { 262 W_L0, W_L1, W_L2, W_L3 263 }; 264 265 enum 266 { 267 W_M3, W_M2, W_M1, W_M0, 268 W_sizeof 269 }; 270 271 272 273 274 275 enum 276 { 277 X_L0, X_L1, X_L2, X_L3, X_L4, X_L5, X_L6, X_L7 278 }; 279 280 enum 281 { 282 X_M7, X_M6, X_M5, X_M4, X_M3, X_M2, X_M1, X_M0, 283 X_sizeof 284 }; 285 286 287 288 289 290 enum 291 { 292 D1_tag_L0, D1_tag_L1, D1_tag_L2, D1_tag_L3, D1_tag_L4, D1_tag_L5, D1_tag_L6, D1_tag_L7, 293 D1_val_L0, D1_val_L1, D1_val_L2, D1_val_L3, D1_val_L4, D1_val_L5, D1_val_L6, D1_val_L7 294 }; 295 296 enum 297 { 298 D1_tag_M7, D1_tag_M6, D1_tag_M5, D1_tag_M4, D1_tag_M3, D1_tag_M2, D1_tag_M1, D1_tag_M0, 299 D1_val_M7, D1_val_M6, D1_val_M5, D1_val_M4, D1_val_M3, D1_val_M2, D1_val_M1, D1_val_M0, 300 D1_sizeof 301 }; 302 303 304 #define E1_Nident 16 305 306 307 308 309 enum { 310 E1_ident, E1_ident_L_Z = E1_Nident - 1, 311 E1_type_L0, E1_type_L1, 312 E1_machine_L0, E1_machine_L1, 313 E1_version_L0, E1_version_L1, E1_version_L2, E1_version_L3, 314 E1_entry_L0, E1_entry_L1, E1_entry_L2, E1_entry_L3, E1_entry_L4, E1_entry_L5, E1_entry_L6, E1_entry_L7, 315 E1_phoff_L0, E1_phoff_L1, E1_phoff_L2, E1_phoff_L3, E1_phoff_L4, E1_phoff_L5, E1_phoff_L6, E1_phoff_L7, 316 E1_shoff_L0, E1_shoff_L1, E1_shoff_L2, E1_shoff_L3, E1_shoff_L4, E1_shoff_L5, E1_shoff_L6, E1_shoff_L7, 317 E1_flags_L0, E1_flags_L1, E1_flags_L2, E1_flags_L3, 318 E1_ehsize_L0, E1_ehsize_L1, 319 E1_phentsize_L0, E1_phentsize_L1, 320 E1_phnum_L0, E1_phnum_L1, 321 E1_shentsize_L0, E1_shentsize_L1, 322 E1_shnum_L0, E1_shnum_L1, 323 E1_shstrndx_L0, E1_shstrndx_L1 324 }; 325 326 enum { 327 E1_ident_M_Z = E1_Nident - 1, 328 E1_type_M1, E1_type_M0, 329 E1_machine_M1, E1_machine_M0, 330 E1_version_M3, E1_version_M2, E1_version_M1, E1_version_M0, 331 E1_entry_M7, E1_entry_M6, E1_entry_M5, E1_entry_M4, E1_entry_M3, E1_entry_M2, E1_entry_M1, E1_entry_M0, 332 E1_phoff_M7, E1_phoff_M6, E1_phoff_M5, E1_phoff_M4, E1_phoff_M3, E1_phoff_M2, E1_phoff_M1, E1_phoff_M0, 333 E1_shoff_M7, E1_shoff_M6, E1_shoff_M5, E1_shoff_M4, E1_shoff_M3, E1_shoff_M2, E1_shoff_M1, E1_shoff_M0, 334 E1_flags_M3, E1_flags_M2, E1_flags_M1, E1_flags_M0, 335 E1_ehsize_M1, E1_ehsize_M0, 336 E1_phentsize_M1, E1_phentsize_M0, 337 E1_phnum_M1, E1_phnum_M0, 338 E1_shentsize_M1, E1_shentsize_M0, 339 E1_shnum_M1, E1_shnum_M0, 340 E1_shstrndx_M1, E1_shstrndx_M0, 341 E1_sizeof 342 }; 343 344 345 346 347 enum 348 { 349 N1_namesz_L0, N1_namesz_L1, N1_namesz_L2, N1_namesz_L3, 350 N1_descsz_L0, N1_descsz_L1, N1_descsz_L2, N1_descsz_L3, 351 N1_type_L0, N1_type_L1, N1_type_L2, N1_type_L3 352 }; 353 354 enum 355 { 356 N1_namesz_M3, N1_namesz_M2, N1_namesz_M1, N1_namesz_M0, 357 N1_descsz_M3, N1_descsz_M2, N1_descsz_M1, N1_descsz_M0, 358 N1_type_M3, N1_type_M2, N1_type_M1, N1_type_M0, 359 N1_sizeof 360 }; 361 362 363 364 365 enum 366 { 367 P1_type_L0, P1_type_L1, P1_type_L2, P1_type_L3, 368 P1_flags_L0, P1_flags_L1, P1_flags_L2, P1_flags_L3, 369 P1_offset_L0, P1_offset_L1, P1_offset_L2, P1_offset_L3, P1_offset_L4, P1_offset_L5, P1_offset_L6, P1_offset_L7, 370 P1_vaddr_L0, P1_vaddr_L1, P1_vaddr_L2, P1_vaddr_L3, P1_vaddr_L4, P1_vaddr_L5, P1_vaddr_L6, P1_vaddr_L7, 371 P1_paddr_L0, P1_paddr_L1, P1_paddr_L2, P1_paddr_L3, P1_paddr_L4, P1_paddr_L5, P1_paddr_L6, P1_paddr_L7, 372 P1_filesz_L0, P1_filesz_L1, P1_filesz_L2, P1_filesz_L3, P1_filesz_L4, P1_filesz_L5, P1_filesz_L6, P1_filesz_L7, 373 P1_memsz_L0, P1_memsz_L1, P1_memsz_L2, P1_memsz_L3, P1_memsz_L4, P1_memsz_L5, P1_memsz_L6, P1_memsz_L7, 374 P1_align_L0, P1_align_L1, P1_align_L2, P1_align_L3, P1_align_L4, P1_align_L5, P1_align_L6, P1_align_L7 375 }; 376 377 enum 378 { 379 P1_type_M3, P1_type_M2, P1_type_M1, P1_type_M0, 380 P1_flags_M3, P1_flags_M2, P1_flags_M1, P1_flags_M0, 381 P1_offset_M7, P1_offset_M6, P1_offset_M5, P1_offset_M4, P1_offset_M3, P1_offset_M2, P1_offset_M1, P1_offset_M0, 382 P1_vaddr_M7, P1_vaddr_M6, P1_vaddr_M5, P1_vaddr_M4, P1_vaddr_M3, P1_vaddr_M2, P1_vaddr_M1, P1_vaddr_M0, 383 P1_paddr_M7, P1_paddr_M6, P1_paddr_M5, P1_paddr_M4, P1_paddr_M3, P1_paddr_M2, P1_paddr_M1, P1_paddr_M0, 384 P1_filesz_M7, P1_filesz_M6, P1_filesz_M5, P1_filesz_M4, P1_filesz_M3, P1_filesz_M2, P1_filesz_M1, P1_filesz_M0, 385 P1_memsz_M7, P1_memsz_M6, P1_memsz_M5, P1_memsz_M4, P1_memsz_M3, P1_memsz_M2, P1_memsz_M1, P1_memsz_M0, 386 P1_align_M7, P1_align_M6, P1_align_M5, P1_align_M4, P1_align_M3, P1_align_M2, P1_align_M1, P1_align_M0, 387 P1_sizeof 388 }; 389 390 391 392 393 394 enum 395 { 396 R1_offset_L0, R1_offset_L1, R1_offset_L2, R1_offset_L3, R1_offset_L4, R1_offset_L5, R1_offset_L6, R1_offset_L7, 397 R1_info_L0, R1_info_L1, R1_info_L2, R1_info_L3, R1_info_L4, R1_info_L5, R1_info_L6, R1_info_L7 398 }; 399 400 enum 401 { 402 R1_offset_M7, R1_offset_M6, R1_offset_M5, R1_offset_M4, R1_offset_M3, R1_offset_M2, R1_offset_M1, R1_offset_M0, 403 R1_info_M7, R1_info_M6, R1_info_M5, R1_info_M4, R1_info_M3, R1_info_M2, R1_info_M1, R1_info_M0, 404 R1_sizeof 405 }; 406 407 408 409 410 411 enum 412 { 413 RA1_offset_L0, RA1_offset_L1, RA1_offset_L2, RA1_offset_L3, RA1_offset_L4, RA1_offset_L5, RA1_offset_L6, RA1_offset_L7, 414 RA1_info_L0, RA1_info_L1, RA1_info_L2, RA1_info_L3, RA1_info_L4, RA1_info_L5, RA1_info_L6, RA1_info_L7, 415 RA1_addend_L0, RA1_addend_L1, RA1_addend_L2, RA1_addend_L3, RA1_addend_L4, RA1_addend_L5, RA1_addend_L6, RA1_addend_L7 416 }; 417 418 enum 419 { 420 RA1_offset_M7, RA1_offset_M6, RA1_offset_M5, RA1_offset_M4, RA1_offset_M3, RA1_offset_M2, RA1_offset_M1, RA1_offset_M0, 421 RA1_info_M7, RA1_info_M6, RA1_info_M5, RA1_info_M4, RA1_info_M3, RA1_info_M2, RA1_info_M1, RA1_info_M0, 422 RA1_addend_M7, RA1_addend_M6, RA1_addend_M5, RA1_addend_M4, RA1_addend_M3, RA1_addend_M2, RA1_addend_M1, RA1_addend_M0, 423 RA1_sizeof 424 }; 425 426 427 428 429 430 enum 431 { 432 SH1_name_L0, SH1_name_L1, SH1_name_L2, SH1_name_L3, 433 SH1_type_L0, SH1_type_L1, SH1_type_L2, SH1_type_L3, 434 SH1_flags_L0, SH1_flags_L1, SH1_flags_L2, SH1_flags_L3, SH1_flags_L4, SH1_flags_L5, SH1_flags_L6, SH1_flags_L7, 435 SH1_addr_L0, SH1_addr_L1, SH1_addr_L2, SH1_addr_L3, SH1_addr_L4, SH1_addr_L5, SH1_addr_L6, SH1_addr_L7, 436 SH1_offset_L0, SH1_offset_L1, SH1_offset_L2, SH1_offset_L3, SH1_offset_L4, SH1_offset_L5, SH1_offset_L6, SH1_offset_L7, 437 SH1_size_L0, SH1_size_L1, SH1_size_L2, SH1_size_L3, SH1_size_L4, SH1_size_L5, SH1_size_L6, SH1_size_L7, 438 SH1_link_L0, SH1_link_L1, SH1_link_L2, SH1_link_L3, 439 SH1_info_L0, SH1_info_L1, SH1_info_L2, SH1_info_L3, 440 SH1_addralign_L0, SH1_addralign_L1, SH1_addralign_L2, SH1_addralign_L3, SH1_addralign_L4, SH1_addralign_L5, SH1_addralign_L6, SH1_addralign_L7, 441 SH1_entsize_L0, SH1_entsize_L1, SH1_entsize_L2, SH1_entsize_L3, SH1_entsize_L4, SH1_entsize_L5, SH1_entsize_L6, SH1_entsize_L7 442 }; 443 444 enum 445 { 446 SH1_name_M3, SH1_name_M2, SH1_name_M1, SH1_name_M0, 447 SH1_type_M3, SH1_type_M2, SH1_type_M1, SH1_type_M0, 448 SH1_flags_M7, SH1_flags_M6, SH1_flags_M5, SH1_flags_M4, SH1_flags_M3, SH1_flags_M2, SH1_flags_M1, SH1_flags_M0, 449 SH1_addr_M7, SH1_addr_M6, SH1_addr_M5, SH1_addr_M4, SH1_addr_M3, SH1_addr_M2, SH1_addr_M1, SH1_addr_M0, 450 SH1_offset_M7, SH1_offset_M6, SH1_offset_M5, SH1_offset_M4, SH1_offset_M3, SH1_offset_M2, SH1_offset_M1, SH1_offset_M0, 451 SH1_size_M7, SH1_size_M6, SH1_size_M5, SH1_size_M4, SH1_size_M3, SH1_size_M2, SH1_size_M1, SH1_size_M0, 452 SH1_link_M3, SH1_link_M2, SH1_link_M1, SH1_link_M0, 453 SH1_info_M3, SH1_info_M2, SH1_info_M1, SH1_info_M0, 454 SH1_addralign_M7, SH1_addralign_M6, SH1_addralign_M5, SH1_addralign_M4, SH1_addralign_M3, SH1_addralign_M2, SH1_addralign_M1, SH1_addralign_M0, 455 SH1_entsize_M7, SH1_entsize_M6, SH1_entsize_M5, SH1_entsize_M4, SH1_entsize_M3, SH1_entsize_M2, SH1_entsize_M1, SH1_entsize_M0, 456 SH1_sizeof 457 }; 458 459 460 461 462 463 enum 464 { 465 ST1_name_L0, ST1_name_L1, ST1_name_L2, ST1_name_L3, 466 ST1_info_L, 467 ST1_other_L, 468 ST1_shndx_L0, ST1_shndx_L1, 469 ST1_value_L0, ST1_value_L1, ST1_value_L2, ST1_value_L3, ST1_value_L4, ST1_value_L5, ST1_value_L6, ST1_value_L7, 470 ST1_size_L0, ST1_size_L1, ST1_size_L2, ST1_size_L3, ST1_size_L4, ST1_size_L5, ST1_size_L6, ST1_size_L7 471 }; 472 473 enum 474 { 475 ST1_name_M3, ST1_name_M2, ST1_name_M1, ST1_name_M0, 476 ST1_info_M, 477 ST1_other_M, 478 ST1_shndx_M1, ST1_shndx_M0, 479 ST1_value_M7, ST1_value_M6, ST1_value_M5, ST1_value_M4, ST1_value_M3, ST1_value_M2, ST1_value_M1, ST1_value_M0, 480 ST1_size_M7, ST1_size_M6, ST1_size_M5, ST1_size_M4, ST1_size_M3, ST1_size_M2, ST1_size_M1, ST1_size_M0, 481 ST1_sizeof 482 }; 483 484 485 486 487 488 enum 489 { 490 SI1_boundto_L0, SI1_boundto_L1, 491 SI1_flags_L0, SI1_flags_L1 492 }; 493 494 enum 495 { 496 SI1_boundto_M1, SI1_boundto_M0, 497 SI1_flags_M1, SI1_flags_M0, 498 SI1_sizeof 499 }; 500 501 502 503 504 505 enum 506 { 507 C1_tag_L0, C1_tag_L1, C1_tag_L2, C1_tag_L3, C1_tag_L4, C1_tag_L5, C1_tag_L6, C1_tag_L7, 508 C1_val_L0, C1_val_L1, C1_val_L2, C1_val_L3, C1_val_L4, C1_val_L5, C1_val_L6, C1_val_L7 509 }; 510 511 enum 512 { 513 C1_tag_M7, C1_tag_M6, C1_tag_M5, C1_tag_M4, C1_tag_M3, C1_tag_M2, C1_tag_M1, C1_tag_M0, 514 C1_val_M7, C1_val_M6, C1_val_M5, C1_val_M4, C1_val_M3, C1_val_M2, C1_val_M1, C1_val_M0, 515 C1_sizeof 516 }; 517 518 519 520 521 522 enum 523 { 524 VD1_version_L0, VD1_version_L1, 525 VD1_flags_L0, VD1_flags_L1, 526 VD1_ndx_L0, VD1_ndx_L1, 527 VD1_cnt_L0, VD1_cnt_L1, 528 VD1_hash_L0, VD1_hash_L1, VD1_hash_L2, VD1_hash_L3, 529 VD1_aux_L0, VD1_aux_L1, VD1_aux_L2, VD1_aux_L3, 530 VD1_next_L0, VD1_next_L1, VD1_next_L2, VD1_next_L3 531 }; 532 533 enum 534 { 535 VD1_version_M1, VD1_version_M0, 536 VD1_flags_M1, VD1_flags_M0, 537 VD1_ndx_M1, VD1_ndx_M0, 538 VD1_cnt_M1, VD1_cnt_M0, 539 VD1_hash_M3, VD1_hash_M2, VD1_hash_M1, VD1_hash_M0, 540 VD1_aux_M3, VD1_aux_M2, VD1_aux_M1, VD1_aux_M0, 541 VD1_next_M3, VD1_next_M2, VD1_next_M1, VD1_next_M0, 542 VD1_sizeof 543 }; 544 545 546 547 548 549 enum 550 { 551 VDA1_name_L0, VDA1_name_L1, VDA1_name_L2, VDA1_name_L3, 552 VDA1_next_L0, VDA1_next_L1, VDA1_next_L2, VDA1_next_L3 553 }; 554 555 enum 556 { 557 VDA1_name_M3, VDA1_name_M2, VDA1_name_M1, VDA1_name_M0, 558 VDA1_next_M3, VDA1_next_M2, VDA1_next_M1, VDA1_next_M0, 559 VDA1_sizeof 560 }; 561 562 563 564 565 566 enum 567 { 568 VN1_version_L0, VN1_version_L1, 569 VN1_cnt_L0, VN1_cnt_L1, 570 VN1_file_L0, VN1_file_L1, VN1_file_L2, VN1_file_L3, 571 VN1_aux_L0, VN1_aux_L1, VN1_aux_L2, VN1_aux_L3, 572 VN1_next_L0, VN1_next_L1, VN1_next_L2, VN1_next_L3 573 }; 574 575 enum 576 { 577 VN1_version_M1, VN1_version_M0, 578 VN1_cnt_M1, VN1_cnt_M0, 579 VN1_file_M3, VN1_file_M2, VN1_file_M1, VN1_file_M0, 580 VN1_aux_M3, VN1_aux_M2, VN1_aux_M1, VN1_aux_M0, 581 VN1_next_M3, VN1_next_M2, VN1_next_M1, VN1_next_M0, 582 VN1_sizeof 583 }; 584 585 586 587 588 589 enum 590 { 591 VNA1_hash_L0, VNA1_hash_L1, VNA1_hash_L2, VNA1_hash_L3, 592 VNA1_flags_L0, VNA1_flags_L1, 593 VNA1_other_L0, VNA1_other_L1, 594 VNA1_name_L0, VNA1_name_L1, VNA1_name_L2, VNA1_name_L3, 595 VNA1_next_L0, VNA1_next_L1, VNA1_next_L2, VNA1_next_L3 596 }; 597 598 enum 599 { 600 VNA1_hash_M3, VNA1_hash_M2, VNA1_hash_M1, VNA1_hash_M0, 601 VNA1_flags_M1, VNA1_flags_M0, 602 VNA1_other_M1, VNA1_other_M0, 603 VNA1_name_M3, VNA1_name_M2, VNA1_name_M1, VNA1_name_M0, 604 VNA1_next_M3, VNA1_next_M2, VNA1_next_M1, VNA1_next_M0, 605 VNA1_sizeof 606 }; 607 608 609 /* 610 * Translation function declarations. 611 * 612 * <object>_<data><dver><sver>_tof 613 * <object>_<data><dver><sver>_tom 614 * where 615 * <data> 2L ELFDATA2LSB 616 * 2M ELFDATA2MSB 617 */ 618 619 static void addr_2L_tof(), addr_2L_tom(), 620 addr_2M_tof(), addr_2M_tom(), 621 byte_to(), 622 dyn_2L11_tof(), dyn_2L11_tom(), 623 dyn_2M11_tof(), dyn_2M11_tom(), 624 ehdr_2L11_tof(), ehdr_2L11_tom(), 625 ehdr_2M11_tof(), ehdr_2M11_tom(), 626 half_2L_tof(), half_2L_tom(), 627 half_2M_tof(), half_2M_tom(), 628 move_2L11_tof(), move_2L11_tom(), 629 move_2M11_tof(), move_2M11_tom(), 630 movep_2L11_tof(), movep_2L11_tom(), 631 movep_2M11_tof(), movep_2M11_tom(), 632 off_2L_tof(), off_2L_tom(), 633 off_2M_tof(), off_2M_tom(), 634 note_2L11_tof(), note_2L11_tom(), 635 note_2M11_tof(), note_2M11_tom(), 636 phdr_2L11_tof(), phdr_2L11_tom(), 637 phdr_2M11_tof(), phdr_2M11_tom(), 638 rel_2L11_tof(), rel_2L11_tom(), 639 rel_2M11_tof(), rel_2M11_tom(), 640 rela_2L11_tof(), rela_2L11_tom(), 641 rela_2M11_tof(), rela_2M11_tom(), 642 shdr_2L11_tof(), shdr_2L11_tom(), 643 shdr_2M11_tof(), shdr_2M11_tom(), 644 sword_2L_tof(), sword_2L_tom(), 645 sword_2M_tof(), sword_2M_tom(), 646 sym_2L11_tof(), sym_2L11_tom(), 647 sym_2M11_tof(), sym_2M11_tom(), 648 syminfo_2L11_tof(), syminfo_2L11_tom(), 649 syminfo_2M11_tof(), syminfo_2M11_tom(), 650 word_2L_tof(), word_2L_tom(), 651 word_2M_tof(), word_2M_tom(), 652 verdef_2L11_tof(), verdef_2L11_tom(), 653 verdef_2M11_tof(), verdef_2M11_tom(), 654 verneed_2L11_tof(), verneed_2L11_tom(), 655 verneed_2M11_tof(), verneed_2M11_tom(), 656 sxword_2L_tof(), sxword_2L_tom(), 657 sxword_2M_tof(), sxword_2M_tom(), 658 xword_2L_tof(), xword_2L_tom(), 659 xword_2M_tof(), xword_2M_tom(), 660 cap_2L11_tof(), cap_2L11_tom(), 661 cap_2M11_tof(), cap_2M11_tom(); 662 663 664 /* 665 * x64 [dst_version - 1] [src_version - 1] [encode - 1] [type] 666 */ 667 668 static struct { 669 void (*x_tof)(), 670 (*x_tom)(); 671 } x64 [EV_CURRENT] [EV_CURRENT] [ELFDATANUM - 1] [ELF_T_NUM] = { 672 { 673 { 674 { /* [1-1][1-1][2LSB-1][.] */ 675 /* BYTE */ { byte_to, byte_to }, 676 /* ADDR */ { addr_2L_tof, addr_2L_tom }, 677 /* DYN */ { dyn_2L11_tof, dyn_2L11_tom }, 678 /* EHDR */ { ehdr_2L11_tof, ehdr_2L11_tom }, 679 /* HALF */ { half_2L_tof, half_2L_tom }, 680 /* OFF */ { off_2L_tof, off_2L_tom }, 681 /* PHDR */ { phdr_2L11_tof, phdr_2L11_tom }, 682 /* RELA */ { rela_2L11_tof, rela_2L11_tom }, 683 /* REL */ { rel_2L11_tof, rel_2L11_tom }, 684 /* SHDR */ { shdr_2L11_tof, shdr_2L11_tom }, 685 /* SWORD */ { sword_2L_tof, sword_2L_tom }, 686 /* SYM */ { sym_2L11_tof, sym_2L11_tom }, 687 /* WORD */ { word_2L_tof, word_2L_tom }, 688 /* VERDEF */ { verdef_2L11_tof, verdef_2L11_tom}, 689 /* VERNEED */ { verneed_2L11_tof, verneed_2L11_tom}, 690 /* SXWORD */ { sxword_2L_tof, sxword_2L_tom }, 691 /* XWORD */ { xword_2L_tof, xword_2L_tom }, 692 /* SYMINFO */ { syminfo_2L11_tof, syminfo_2L11_tom }, 693 /* NOTE */ { note_2L11_tof, note_2L11_tom }, 694 /* MOVE */ { move_2L11_tof, move_2L11_tom }, 695 /* MOVEP */ { movep_2L11_tof, movep_2L11_tom }, 696 /* CAP */ { cap_2L11_tof, cap_2L11_tom }, 697 }, 698 { /* [1-1][1-1][2MSB-1][.] */ 699 /* BYTE */ { byte_to, byte_to }, 700 /* ADDR */ { addr_2M_tof, addr_2M_tom }, 701 /* DYN */ { dyn_2M11_tof, dyn_2M11_tom }, 702 /* EHDR */ { ehdr_2M11_tof, ehdr_2M11_tom }, 703 /* HALF */ { half_2M_tof, half_2M_tom }, 704 /* OFF */ { off_2M_tof, off_2M_tom }, 705 /* PHDR */ { phdr_2M11_tof, phdr_2M11_tom }, 706 /* RELA */ { rela_2M11_tof, rela_2M11_tom }, 707 /* REL */ { rel_2M11_tof, rel_2M11_tom }, 708 /* SHDR */ { shdr_2M11_tof, shdr_2M11_tom }, 709 /* SWORD */ { sword_2M_tof, sword_2M_tom }, 710 /* SYM */ { sym_2M11_tof, sym_2M11_tom }, 711 /* WORD */ { word_2M_tof, word_2M_tom }, 712 /* VERDEF */ { verdef_2M11_tof, verdef_2M11_tom}, 713 /* VERNEED */ { verneed_2M11_tof, verneed_2M11_tom}, 714 /* SXWORD */ { sxword_2M_tof, sxword_2M_tom }, 715 /* XWORD */ { xword_2M_tof, xword_2M_tom }, 716 /* SYMINFO */ { syminfo_2M11_tof, syminfo_2M11_tom }, 717 /* NOTE */ { note_2M11_tof, note_2M11_tom }, 718 /* MOVE */ { move_2M11_tof, move_2M11_tom }, 719 /* MOVEP */ { movep_2M11_tof, movep_2M11_tom }, 720 /* CAP */ { cap_2M11_tof, cap_2M11_tom }, 721 }, 722 }, 723 }, 724 }; 725 726 727 /* 728 * size [version - 1] [type] 729 */ 730 731 static const struct { 732 size_t s_filesz, 733 s_memsz; 734 } fmsize [EV_CURRENT] [ELF_T_NUM] = 735 { 736 { /* [1-1][.] */ 737 /* BYTE */ { 1, 1 }, 738 /* ADDR */ { A_sizeof, sizeof (Elf64_Addr) }, 739 /* DYN */ { D1_sizeof, sizeof (Elf64_Dyn) }, 740 /* EHDR */ { E1_sizeof, sizeof (Elf64_Ehdr) }, 741 /* HALF */ { H_sizeof, sizeof (Elf64_Half) }, 742 /* OFF */ { O_sizeof, sizeof (Elf64_Off) }, 743 /* PHDR */ { P1_sizeof, sizeof (Elf64_Phdr) }, 744 /* RELA */ { RA1_sizeof, sizeof (Elf64_Rela) }, 745 /* REL */ { R1_sizeof, sizeof (Elf64_Rel) }, 746 /* SHDR */ { SH1_sizeof, sizeof (Elf64_Shdr) }, 747 /* SWORD */ { W_sizeof, sizeof (Elf64_Sword) }, 748 /* SYM */ { ST1_sizeof, sizeof (Elf64_Sym) }, 749 /* WORD */ { W_sizeof, sizeof (Elf64_Word) }, 750 /* VERDEF */ { 1, 1 }, /* both VERDEF & VERNEED have varying size */ 751 /* VERNEED */ { 1, 1 }, /* structures so we set their sizes to 1 */ 752 /* SXWORD */ { X_sizeof, sizeof (Elf64_Sxword) }, 753 /* XWORD */ { X_sizeof, sizeof (Elf64_Xword) }, 754 /* SYMINFO */ { SI1_sizeof, sizeof (Elf64_Syminfo) }, 755 /* NOTE */ { 1, 1}, /* NOTE has varying sized data we can't */ 756 /* use the usual table magic. */ 757 /* MOVE */ { M1_sizeof, sizeof (Elf64_Move) }, 758 /* MOVEP */ { MP1_sizeof, sizeof (Elf64_Move) }, 759 /* CAP */ { C1_sizeof, sizeof (Elf64_Cap) }, 760 }, 761 }; 762 763 764 /* 765 * memory type [version - 1] [section type] 766 */ 767 768 static const Elf_Type mtype[EV_CURRENT][SHT_NUM] = 769 { 770 { /* [1-1][.] */ 771 /* NULL */ ELF_T_BYTE, 772 /* PROGBITS */ ELF_T_BYTE, 773 /* SYMTAB */ ELF_T_SYM, 774 /* STRTAB */ ELF_T_BYTE, 775 /* RELA */ ELF_T_RELA, 776 /* HASH */ ELF_T_WORD, 777 /* DYNAMIC */ ELF_T_DYN, 778 /* NOTE */ ELF_T_NOTE, 779 /* NOBITS */ ELF_T_BYTE, 780 /* REL */ ELF_T_REL, 781 /* SHLIB */ ELF_T_BYTE, 782 /* DYNSYM */ ELF_T_SYM, 783 /* UNKNOWN12 */ ELF_T_BYTE, 784 /* UNKNOWN13 */ ELF_T_BYTE, 785 /* INIT_ARRAY */ ELF_T_ADDR, 786 /* FINI_ARRAY */ ELF_T_ADDR, 787 /* PREINIT_ARRAY */ ELF_T_ADDR, 788 /* GROUP */ ELF_T_WORD, 789 /* SYMTAB_SHNDX */ ELF_T_WORD 790 }, 791 }; 792 793 794 size_t 795 elf64_fsize(Elf_Type type, size_t count, unsigned ver) 796 { 797 if (--ver >= EV_CURRENT) { 798 _elf_seterr(EREQ_VER, 0); 799 return (0); 800 } 801 if ((unsigned)type >= ELF_T_NUM) { 802 _elf_seterr(EREQ_TYPE, 0); 803 return (0); 804 } 805 return (fmsize[ver][type].s_filesz * count); 806 } 807 808 809 size_t 810 _elf64_msize(Elf_Type type, unsigned ver) 811 { 812 return (fmsize[ver - 1][type].s_memsz); 813 } 814 815 816 Elf_Type 817 /* ARGSUSED */ 818 _elf64_mtype(Elf * elf, Elf64_Word shtype, unsigned ver) 819 { 820 Elf64_Ehdr * ehdr = (Elf64_Ehdr *)elf->ed_ehdr; 821 822 if (shtype < SHT_NUM) 823 return (mtype[ver - 1][shtype]); 824 825 switch (shtype) { 826 case SHT_SUNW_symsort: 827 case SHT_SUNW_tlssort: 828 return (ELF_T_WORD); 829 case SHT_SUNW_LDYNSYM: 830 return (ELF_T_SYM); 831 case SHT_SUNW_dof: 832 return (ELF_T_BYTE); 833 case SHT_SUNW_cap: 834 return (ELF_T_CAP); 835 case SHT_SUNW_capchain: 836 return (ELF_T_WORD); 837 case SHT_SUNW_capinfo: 838 return (ELF_T_XWORD); 839 case SHT_SUNW_SIGNATURE: 840 return (ELF_T_BYTE); 841 case SHT_SUNW_ANNOTATE: 842 return (ELF_T_BYTE); 843 case SHT_SUNW_DEBUGSTR: 844 return (ELF_T_BYTE); 845 case SHT_SUNW_DEBUG: 846 return (ELF_T_BYTE); 847 case SHT_SUNW_move: 848 /* 849 * Right now - the only 64bit binaries I know 850 * about with a move is SPARC - and SPARC 851 * binaries pad the size of the move. 852 */ 853 return (ELF_T_MOVEP); 854 case SHT_SUNW_COMDAT: 855 return (ELF_T_BYTE); 856 case SHT_SUNW_syminfo: 857 return (ELF_T_SYMINFO); 858 case SHT_SUNW_verdef: 859 return (ELF_T_VDEF); 860 case SHT_SUNW_verneed: 861 return (ELF_T_VNEED); 862 case SHT_SUNW_versym: 863 return (ELF_T_HALF); 864 }; 865 866 /* 867 * Check for the sparc specific section types 868 * below. 869 */ 870 if (((ehdr->e_machine == EM_SPARC) || 871 (ehdr->e_machine == EM_SPARC32PLUS) || 872 (ehdr->e_machine == EM_SPARCV9)) && 873 (shtype == SHT_SPARC_GOTDATA)) 874 return (ELF_T_BYTE); 875 876 /* 877 * Check for the amd64 specific section types 878 * below. 879 */ 880 if ((ehdr->e_machine == EM_AMD64) && 881 (shtype == SHT_AMD64_UNWIND)) 882 return (ELF_T_BYTE); 883 884 /* 885 * And the default is ELF_T_BYTE - but we should 886 * certainly have caught any sections we know about 887 * above. This is for unknown sections to libelf. 888 */ 889 return (ELF_T_BYTE); 890 } 891 892 893 size_t 894 _elf64_entsz(Elf *elf, Elf64_Word shtype, unsigned ver) 895 { 896 Elf_Type ttype; 897 898 ttype = _elf64_mtype(elf, shtype, ver); 899 return ((ttype == ELF_T_BYTE) ? 0 : fmsize[ver - 1][ttype].s_filesz); 900 } 901 902 903 static Elf_Data * 904 xlate(Elf_Data *dst, const Elf_Data *src, unsigned encode, int tof) 905 /* !0 -> xlatetof */ 906 { 907 size_t cnt, dsz, ssz; 908 unsigned type; 909 unsigned dver, sver; 910 void (*f)(); 911 unsigned _encode; 912 913 if (dst == 0 || src == 0) 914 return (0); 915 if (--encode >= (ELFDATANUM - 1)) { 916 _elf_seterr(EREQ_ENCODE, 0); 917 return (0); 918 } 919 if ((dver = dst->d_version - 1) >= EV_CURRENT || 920 (sver = src->d_version - 1) >= EV_CURRENT) { 921 _elf_seterr(EREQ_VER, 0); 922 return (0); 923 } 924 if ((type = src->d_type) >= ELF_T_NUM) { 925 _elf_seterr(EREQ_TYPE, 0); 926 return (0); 927 } 928 929 if (tof) { 930 dsz = fmsize[dver][type].s_filesz; 931 ssz = fmsize[sver][type].s_memsz; 932 f = x64[dver][sver][encode][type].x_tof; 933 } else { 934 dsz = fmsize[dver][type].s_memsz; 935 ssz = fmsize[sver][type].s_filesz; 936 f = x64[dver][sver][encode][type].x_tom; 937 } 938 cnt = src->d_size / ssz; 939 if (dst->d_size < dsz * cnt) { 940 _elf_seterr(EREQ_DSZ, 0); 941 return (0); 942 } 943 944 ELFACCESSDATA(_encode, _elf_encode) 945 if ((_encode == (encode + 1)) && (dsz == ssz)) { 946 /* 947 * ld(1) frequently produces empty sections (eg. .dynsym, 948 * .dynstr, .symtab, .strtab, etc) so that the initial 949 * output image can be created of the correct size. Later 950 * these sections are filled in with the associated data. 951 * So that we don't have to pre-allocate buffers for 952 * these segments, allow for the src destination to be 0. 953 */ 954 if (src->d_buf && src->d_buf != dst->d_buf) 955 (void) memcpy(dst->d_buf, src->d_buf, src->d_size); 956 dst->d_type = src->d_type; 957 dst->d_size = src->d_size; 958 return (dst); 959 } 960 if (cnt) 961 (*f)(dst->d_buf, src->d_buf, cnt); 962 dst->d_size = dsz * cnt; 963 dst->d_type = src->d_type; 964 return (dst); 965 } 966 967 968 Elf_Data * 969 elf64_xlatetof(Elf_Data *dst, const Elf_Data *src, unsigned encode) 970 { 971 return (xlate(dst, src, encode, 1)); 972 } 973 974 975 Elf_Data * 976 elf64_xlatetom(Elf_Data *dst, const Elf_Data *src, unsigned encode) 977 { 978 return (xlate(dst, src, encode, 0)); 979 } 980 981 982 /* 983 * xlate to file format 984 * 985 * ..._tof(name, data) -- macros 986 * 987 * Recall that the file format must be no larger than the 988 * memory format (equal versions). Use "forward" copy. 989 * All these routines require non-null, non-zero arguments. 990 */ 991 992 993 994 995 static void 996 addr_2L_tof(Byte *dst, Elf64_Addr *src, size_t cnt) 997 { 998 Elf64_Addr *end = src + cnt; 999 1000 do { 1001 { Elf64_Addr _t_ = *src; 1002 (dst)[A_L0] = (Byte)_t_, 1003 (dst)[A_L1] = (Byte)(_t_>>8), 1004 (dst)[A_L2] = (Byte)(_t_>>16), 1005 (dst)[A_L3] = (Byte)(_t_>>24), 1006 (dst)[A_L4] = (Byte)(_t_>>32), 1007 (dst)[A_L5] = (Byte)(_t_>>40), 1008 (dst)[A_L6] = (Byte)(_t_>>48), 1009 (dst)[A_L7] = (Byte)(_t_>>56); }; 1010 dst += A_sizeof; 1011 } while (++src < end); 1012 } 1013 1014 static void 1015 addr_2M_tof(Byte *dst, Elf64_Addr *src, size_t cnt) 1016 { 1017 Elf64_Addr *end = src + cnt; 1018 1019 do { 1020 { Elf64_Addr _t_ = *src; 1021 (dst)[A_M0] = (Byte)_t_, 1022 (dst)[A_M1] = (Byte)(_t_>>8), 1023 (dst)[A_M2] = (Byte)(_t_>>16), 1024 (dst)[A_M3] = (Byte)(_t_>>24), 1025 (dst)[A_M4] = (Byte)(_t_>>32), 1026 (dst)[A_M5] = (Byte)(_t_>>40), 1027 (dst)[A_M6] = (Byte)(_t_>>48), 1028 (dst)[A_M7] = (Byte)(_t_>>56); }; 1029 dst += A_sizeof; 1030 } while (++src < end); 1031 } 1032 1033 1034 static void 1035 byte_to(Byte *dst, Byte *src, size_t cnt) 1036 { 1037 if (dst != src) 1038 (void) memcpy(dst, src, cnt); 1039 } 1040 1041 1042 1043 1044 1045 static void 1046 dyn_2L11_tof(Byte *dst, Elf64_Dyn *src, size_t cnt) 1047 { 1048 Elf64_Dyn *end = src + cnt; 1049 1050 do { 1051 { Elf64_Xword _t_ = src->d_tag; 1052 (dst)[D1_tag_L0] = (Byte)_t_, 1053 (dst)[D1_tag_L1] = (Byte)(_t_>>8), 1054 (dst)[D1_tag_L2] = (Byte)(_t_>>16), 1055 (dst)[D1_tag_L3] = (Byte)(_t_>>24), 1056 (dst)[D1_tag_L4] = (Byte)(_t_>>32), 1057 (dst)[D1_tag_L5] = (Byte)(_t_>>40), 1058 (dst)[D1_tag_L6] = (Byte)(_t_>>48), 1059 (dst)[D1_tag_L7] = (Byte)(_t_>>56); }; 1060 { Elf64_Xword _t_ = src->d_un.d_val; 1061 (dst)[D1_val_L0] = (Byte)_t_, 1062 (dst)[D1_val_L1] = (Byte)(_t_>>8), 1063 (dst)[D1_val_L2] = (Byte)(_t_>>16), 1064 (dst)[D1_val_L3] = (Byte)(_t_>>24), 1065 (dst)[D1_val_L4] = (Byte)(_t_>>32), 1066 (dst)[D1_val_L5] = (Byte)(_t_>>40), 1067 (dst)[D1_val_L6] = (Byte)(_t_>>48), 1068 (dst)[D1_val_L7] = (Byte)(_t_>>56); }; 1069 dst += D1_sizeof; 1070 } while (++src < end); 1071 } 1072 1073 static void 1074 dyn_2M11_tof(Byte *dst, Elf64_Dyn *src, size_t cnt) 1075 { 1076 Elf64_Dyn *end = src + cnt; 1077 1078 do { 1079 { Elf64_Xword _t_ = src->d_tag; 1080 (dst)[D1_tag_M0] = (Byte)_t_, 1081 (dst)[D1_tag_M1] = (Byte)(_t_>>8), 1082 (dst)[D1_tag_M2] = (Byte)(_t_>>16), 1083 (dst)[D1_tag_M3] = (Byte)(_t_>>24), 1084 (dst)[D1_tag_M4] = (Byte)(_t_>>32), 1085 (dst)[D1_tag_M5] = (Byte)(_t_>>40), 1086 (dst)[D1_tag_M6] = (Byte)(_t_>>48), 1087 (dst)[D1_tag_M7] = (Byte)(_t_>>56); }; 1088 { Elf64_Xword _t_ = src->d_un.d_val; 1089 (dst)[D1_val_M0] = (Byte)_t_, 1090 (dst)[D1_val_M1] = (Byte)(_t_>>8), 1091 (dst)[D1_val_M2] = (Byte)(_t_>>16), 1092 (dst)[D1_val_M3] = (Byte)(_t_>>24), 1093 (dst)[D1_val_M4] = (Byte)(_t_>>32), 1094 (dst)[D1_val_M5] = (Byte)(_t_>>40), 1095 (dst)[D1_val_M6] = (Byte)(_t_>>48), 1096 (dst)[D1_val_M7] = (Byte)(_t_>>56); }; 1097 dst += D1_sizeof; 1098 } while (++src < end); 1099 } 1100 1101 1102 1103 1104 1105 static void 1106 ehdr_2L11_tof(Byte *dst, Elf64_Ehdr *src, size_t cnt) 1107 { 1108 Elf64_Ehdr *end = src + cnt; 1109 1110 do { 1111 if (&dst[E1_ident] != src->e_ident) 1112 (void) memcpy(&dst[E1_ident], src->e_ident, E1_Nident); 1113 { Elf64_Half _t_ = src->e_type; 1114 (dst)[E1_type_L0] = (Byte)_t_, 1115 (dst)[E1_type_L1] = (Byte)(_t_>>8); }; 1116 { Elf64_Half _t_ = src->e_machine; 1117 (dst)[E1_machine_L0] = (Byte)_t_, 1118 (dst)[E1_machine_L1] = (Byte)(_t_>>8); }; 1119 { Elf64_Word _t_ = src->e_version; 1120 (dst)[E1_version_L0] = (Byte)_t_, 1121 (dst)[E1_version_L1] = (Byte)(_t_>>8), 1122 (dst)[E1_version_L2] = (Byte)(_t_>>16), 1123 (dst)[E1_version_L3] = (Byte)(_t_>>24); }; 1124 { Elf64_Addr _t_ = src->e_entry; 1125 (dst)[E1_entry_L0] = (Byte)_t_, 1126 (dst)[E1_entry_L1] = (Byte)(_t_>>8), 1127 (dst)[E1_entry_L2] = (Byte)(_t_>>16), 1128 (dst)[E1_entry_L3] = (Byte)(_t_>>24), 1129 (dst)[E1_entry_L4] = (Byte)(_t_>>32), 1130 (dst)[E1_entry_L5] = (Byte)(_t_>>40), 1131 (dst)[E1_entry_L6] = (Byte)(_t_>>48), 1132 (dst)[E1_entry_L7] = (Byte)(_t_>>56); }; 1133 { Elf64_Off _t_ = src->e_phoff; 1134 (dst)[E1_phoff_L0] = (Byte)_t_, 1135 (dst)[E1_phoff_L1] = (Byte)(_t_>>8), 1136 (dst)[E1_phoff_L2] = (Byte)(_t_>>16), 1137 (dst)[E1_phoff_L3] = (Byte)(_t_>>24), 1138 (dst)[E1_phoff_L4] = (Byte)(_t_>>32), 1139 (dst)[E1_phoff_L5] = (Byte)(_t_>>40), 1140 (dst)[E1_phoff_L6] = (Byte)(_t_>>48), 1141 (dst)[E1_phoff_L7] = (Byte)(_t_>>56); }; 1142 { Elf64_Off _t_ = src->e_shoff; 1143 (dst)[E1_shoff_L0] = (Byte)_t_, 1144 (dst)[E1_shoff_L1] = (Byte)(_t_>>8), 1145 (dst)[E1_shoff_L2] = (Byte)(_t_>>16), 1146 (dst)[E1_shoff_L3] = (Byte)(_t_>>24), 1147 (dst)[E1_shoff_L4] = (Byte)(_t_>>32), 1148 (dst)[E1_shoff_L5] = (Byte)(_t_>>40), 1149 (dst)[E1_shoff_L6] = (Byte)(_t_>>48), 1150 (dst)[E1_shoff_L7] = (Byte)(_t_>>56); }; 1151 { Elf64_Word _t_ = src->e_flags; 1152 (dst)[E1_flags_L0] = (Byte)_t_, 1153 (dst)[E1_flags_L1] = (Byte)(_t_>>8), 1154 (dst)[E1_flags_L2] = (Byte)(_t_>>16), 1155 (dst)[E1_flags_L3] = (Byte)(_t_>>24); }; 1156 { Elf64_Half _t_ = src->e_ehsize; 1157 (dst)[E1_ehsize_L0] = (Byte)_t_, 1158 (dst)[E1_ehsize_L1] = (Byte)(_t_>>8); }; 1159 { Elf64_Half _t_ = src->e_phentsize; 1160 (dst)[E1_phentsize_L0] = (Byte)_t_, 1161 (dst)[E1_phentsize_L1] = (Byte)(_t_>>8); }; 1162 { Elf64_Half _t_ = src->e_phnum; 1163 (dst)[E1_phnum_L0] = (Byte)_t_, 1164 (dst)[E1_phnum_L1] = (Byte)(_t_>>8); }; 1165 { Elf64_Half _t_ = src->e_shentsize; 1166 (dst)[E1_shentsize_L0] = (Byte)_t_, 1167 (dst)[E1_shentsize_L1] = (Byte)(_t_>>8); }; 1168 { Elf64_Half _t_ = src->e_shnum; 1169 (dst)[E1_shnum_L0] = (Byte)_t_, 1170 (dst)[E1_shnum_L1] = (Byte)(_t_>>8); }; 1171 { Elf64_Half _t_ = src->e_shstrndx; 1172 (dst)[E1_shstrndx_L0] = (Byte)_t_, 1173 (dst)[E1_shstrndx_L1] = (Byte)(_t_>>8); }; 1174 dst += E1_sizeof; 1175 } while (++src < end); 1176 } 1177 1178 static void 1179 ehdr_2M11_tof(Byte *dst, Elf64_Ehdr *src, size_t cnt) 1180 { 1181 Elf64_Ehdr *end = src + cnt; 1182 1183 do { 1184 if (&dst[E1_ident] != src->e_ident) 1185 (void) memcpy(&dst[E1_ident], src->e_ident, E1_Nident); 1186 { Elf64_Half _t_ = src->e_type; 1187 (dst)[E1_type_M0] = (Byte)_t_, 1188 (dst)[E1_type_M1] = (Byte)(_t_>>8); }; 1189 { Elf64_Half _t_ = src->e_machine; 1190 (dst)[E1_machine_M0] = (Byte)_t_, 1191 (dst)[E1_machine_M1] = (Byte)(_t_>>8); }; 1192 { Elf64_Word _t_ = src->e_version; 1193 (dst)[E1_version_M0] = (Byte)_t_, 1194 (dst)[E1_version_M1] = (Byte)(_t_>>8), 1195 (dst)[E1_version_M2] = (Byte)(_t_>>16), 1196 (dst)[E1_version_M3] = (Byte)(_t_>>24); }; 1197 { Elf64_Addr _t_ = src->e_entry; 1198 (dst)[E1_entry_M0] = (Byte)_t_, 1199 (dst)[E1_entry_M1] = (Byte)(_t_>>8), 1200 (dst)[E1_entry_M2] = (Byte)(_t_>>16), 1201 (dst)[E1_entry_M3] = (Byte)(_t_>>24), 1202 (dst)[E1_entry_M4] = (Byte)(_t_>>32), 1203 (dst)[E1_entry_M5] = (Byte)(_t_>>40), 1204 (dst)[E1_entry_M6] = (Byte)(_t_>>48), 1205 (dst)[E1_entry_M7] = (Byte)(_t_>>56); }; 1206 { Elf64_Off _t_ = src->e_phoff; 1207 (dst)[E1_phoff_M0] = (Byte)_t_, 1208 (dst)[E1_phoff_M1] = (Byte)(_t_>>8), 1209 (dst)[E1_phoff_M2] = (Byte)(_t_>>16), 1210 (dst)[E1_phoff_M3] = (Byte)(_t_>>24), 1211 (dst)[E1_phoff_M4] = (Byte)(_t_>>32), 1212 (dst)[E1_phoff_M5] = (Byte)(_t_>>40), 1213 (dst)[E1_phoff_M6] = (Byte)(_t_>>48), 1214 (dst)[E1_phoff_M7] = (Byte)(_t_>>56); }; 1215 { Elf64_Off _t_ = src->e_shoff; 1216 (dst)[E1_shoff_M0] = (Byte)_t_, 1217 (dst)[E1_shoff_M1] = (Byte)(_t_>>8), 1218 (dst)[E1_shoff_M2] = (Byte)(_t_>>16), 1219 (dst)[E1_shoff_M3] = (Byte)(_t_>>24), 1220 (dst)[E1_shoff_M4] = (Byte)(_t_>>32), 1221 (dst)[E1_shoff_M5] = (Byte)(_t_>>40), 1222 (dst)[E1_shoff_M6] = (Byte)(_t_>>48), 1223 (dst)[E1_shoff_M7] = (Byte)(_t_>>56); }; 1224 { Elf64_Word _t_ = src->e_flags; 1225 (dst)[E1_flags_M0] = (Byte)_t_, 1226 (dst)[E1_flags_M1] = (Byte)(_t_>>8), 1227 (dst)[E1_flags_M2] = (Byte)(_t_>>16), 1228 (dst)[E1_flags_M3] = (Byte)(_t_>>24); }; 1229 { Elf64_Half _t_ = src->e_ehsize; 1230 (dst)[E1_ehsize_M0] = (Byte)_t_, 1231 (dst)[E1_ehsize_M1] = (Byte)(_t_>>8); }; 1232 { Elf64_Half _t_ = src->e_phentsize; 1233 (dst)[E1_phentsize_M0] = (Byte)_t_, 1234 (dst)[E1_phentsize_M1] = (Byte)(_t_>>8); }; 1235 { Elf64_Half _t_ = src->e_phnum; 1236 (dst)[E1_phnum_M0] = (Byte)_t_, 1237 (dst)[E1_phnum_M1] = (Byte)(_t_>>8); }; 1238 { Elf64_Half _t_ = src->e_shentsize; 1239 (dst)[E1_shentsize_M0] = (Byte)_t_, 1240 (dst)[E1_shentsize_M1] = (Byte)(_t_>>8); }; 1241 { Elf64_Half _t_ = src->e_shnum; 1242 (dst)[E1_shnum_M0] = (Byte)_t_, 1243 (dst)[E1_shnum_M1] = (Byte)(_t_>>8); }; 1244 { Elf64_Half _t_ = src->e_shstrndx; 1245 (dst)[E1_shstrndx_M0] = (Byte)_t_, 1246 (dst)[E1_shstrndx_M1] = (Byte)(_t_>>8); }; 1247 dst += E1_sizeof; 1248 } while (++src < end); 1249 } 1250 1251 1252 1253 1254 1255 static void 1256 half_2L_tof(Byte *dst, Elf64_Half *src, size_t cnt) 1257 { 1258 Elf64_Half *end = src + cnt; 1259 1260 do { 1261 { Elf64_Half _t_ = *src; 1262 (dst)[H_L0] = (Byte)_t_, 1263 (dst)[H_L1] = (Byte)(_t_>>8); }; 1264 dst += H_sizeof; 1265 } while (++src < end); 1266 } 1267 1268 static void 1269 half_2M_tof(Byte *dst, Elf64_Half *src, size_t cnt) 1270 { 1271 Elf64_Half *end = src + cnt; 1272 1273 do { 1274 { Elf64_Half _t_ = *src; 1275 (dst)[H_M0] = (Byte)_t_, 1276 (dst)[H_M1] = (Byte)(_t_>>8); }; 1277 dst += H_sizeof; 1278 } while (++src < end); 1279 } 1280 1281 1282 1283 1284 1285 static void 1286 move_2L11_tof(unsigned char *dst, Elf64_Move *src, size_t cnt) 1287 { 1288 Elf64_Move *end = src + cnt; 1289 1290 do { 1291 { Elf64_Lword _t_ = src->m_value; 1292 (dst)[M1_value_L0] = (Byte)_t_, 1293 (dst)[M1_value_L1] = (Byte)(_t_>>8), 1294 (dst)[M1_value_L2] = (Byte)(_t_>>16), 1295 (dst)[M1_value_L3] = (Byte)(_t_>>24), 1296 (dst)[M1_value_L4] = (Byte)(_t_>>32), 1297 (dst)[M1_value_L5] = (Byte)(_t_>>40), 1298 (dst)[M1_value_L6] = (Byte)(_t_>>48), 1299 (dst)[M1_value_L7] = (Byte)(_t_>>56); }; 1300 { Elf64_Word _t_ = src->m_info; 1301 (dst)[M1_info_L0] = (Byte)_t_, 1302 (dst)[M1_info_L1] = (Byte)(_t_>>8), 1303 (dst)[M1_info_L2] = (Byte)(_t_>>16), 1304 (dst)[M1_info_L3] = (Byte)(_t_>>24); }; 1305 { Elf64_Word _t_ = src->m_poffset; 1306 (dst)[M1_poffset_L0] = (Byte)_t_, 1307 (dst)[M1_poffset_L1] = (Byte)(_t_>>8), 1308 (dst)[M1_poffset_L2] = (Byte)(_t_>>16), 1309 (dst)[M1_poffset_L3] = (Byte)(_t_>>24); }; 1310 { Elf64_Half _t_ = src->m_repeat; 1311 (dst)[M1_repeat_L0] = (Byte)_t_, 1312 (dst)[M1_repeat_L1] = (Byte)(_t_>>8); }; 1313 { Elf64_Half _t_ = src->m_stride; 1314 (dst)[M1_stride_L0] = (Byte)_t_, 1315 (dst)[M1_stride_L1] = (Byte)(_t_>>8); }; 1316 dst += M1_sizeof; 1317 } while (++src < end); 1318 } 1319 1320 static void 1321 move_2M11_tof(unsigned char *dst, Elf64_Move *src, size_t cnt) 1322 { 1323 Elf64_Move *end = src + cnt; 1324 1325 do { 1326 { Elf64_Lword _t_ = src->m_value; 1327 (dst)[M1_value_M0] = (Byte)_t_, 1328 (dst)[M1_value_M1] = (Byte)(_t_>>8), 1329 (dst)[M1_value_M2] = (Byte)(_t_>>16), 1330 (dst)[M1_value_M3] = (Byte)(_t_>>24), 1331 (dst)[M1_value_M4] = (Byte)(_t_>>32), 1332 (dst)[M1_value_M5] = (Byte)(_t_>>40), 1333 (dst)[M1_value_M6] = (Byte)(_t_>>48), 1334 (dst)[M1_value_M7] = (Byte)(_t_>>56); }; 1335 { Elf64_Word _t_ = src->m_info; 1336 (dst)[M1_info_M0] = (Byte)_t_, 1337 (dst)[M1_info_M1] = (Byte)(_t_>>8), 1338 (dst)[M1_info_M2] = (Byte)(_t_>>16), 1339 (dst)[M1_info_M3] = (Byte)(_t_>>24); }; 1340 { Elf64_Word _t_ = src->m_poffset; 1341 (dst)[M1_poffset_M0] = (Byte)_t_, 1342 (dst)[M1_poffset_M1] = (Byte)(_t_>>8), 1343 (dst)[M1_poffset_M2] = (Byte)(_t_>>16), 1344 (dst)[M1_poffset_M3] = (Byte)(_t_>>24); }; 1345 { Elf64_Half _t_ = src->m_repeat; 1346 (dst)[M1_repeat_M0] = (Byte)_t_, 1347 (dst)[M1_repeat_M1] = (Byte)(_t_>>8); }; 1348 { Elf64_Half _t_ = src->m_stride; 1349 (dst)[M1_stride_M0] = (Byte)_t_, 1350 (dst)[M1_stride_M1] = (Byte)(_t_>>8); }; 1351 dst += M1_sizeof; 1352 } while (++src < end); 1353 } 1354 1355 1356 1357 1358 1359 static void 1360 movep_2L11_tof(unsigned char *dst, Elf64_Move *src, size_t cnt) 1361 { 1362 Elf64_Move *end = src + cnt; 1363 1364 do { 1365 { Elf64_Lword _t_ = src->m_value; 1366 (dst)[MP1_value_L0] = (Byte)_t_, 1367 (dst)[MP1_value_L1] = (Byte)(_t_>>8), 1368 (dst)[MP1_value_L2] = (Byte)(_t_>>16), 1369 (dst)[MP1_value_L3] = (Byte)(_t_>>24), 1370 (dst)[MP1_value_L4] = (Byte)(_t_>>32), 1371 (dst)[MP1_value_L5] = (Byte)(_t_>>40), 1372 (dst)[MP1_value_L6] = (Byte)(_t_>>48), 1373 (dst)[MP1_value_L7] = (Byte)(_t_>>56); }; 1374 { Elf64_Word _t_ = src->m_info; 1375 (dst)[MP1_info_L0] = (Byte)_t_, 1376 (dst)[MP1_info_L1] = (Byte)(_t_>>8), 1377 (dst)[MP1_info_L2] = (Byte)(_t_>>16), 1378 (dst)[MP1_info_L3] = (Byte)(_t_>>24); }; 1379 { Elf64_Word _t_ = src->m_poffset; 1380 (dst)[MP1_poffset_L0] = (Byte)_t_, 1381 (dst)[MP1_poffset_L1] = (Byte)(_t_>>8), 1382 (dst)[MP1_poffset_L2] = (Byte)(_t_>>16), 1383 (dst)[MP1_poffset_L3] = (Byte)(_t_>>24); }; 1384 { Elf64_Half _t_ = src->m_repeat; 1385 (dst)[MP1_repeat_L0] = (Byte)_t_, 1386 (dst)[MP1_repeat_L1] = (Byte)(_t_>>8); }; 1387 { Elf64_Half _t_ = src->m_stride; 1388 (dst)[MP1_stride_L0] = (Byte)_t_, 1389 (dst)[MP1_stride_L1] = (Byte)(_t_>>8); }; 1390 dst += MP1_sizeof; 1391 } while (++src < end); 1392 } 1393 1394 static void 1395 movep_2M11_tof(unsigned char *dst, Elf64_Move *src, size_t cnt) 1396 { 1397 Elf64_Move *end = src + cnt; 1398 1399 do { 1400 { Elf64_Lword _t_ = src->m_value; 1401 (dst)[MP1_value_M0] = (Byte)_t_, 1402 (dst)[MP1_value_M1] = (Byte)(_t_>>8), 1403 (dst)[MP1_value_M2] = (Byte)(_t_>>16), 1404 (dst)[MP1_value_M3] = (Byte)(_t_>>24), 1405 (dst)[MP1_value_M4] = (Byte)(_t_>>32), 1406 (dst)[MP1_value_M5] = (Byte)(_t_>>40), 1407 (dst)[MP1_value_M6] = (Byte)(_t_>>48), 1408 (dst)[MP1_value_M7] = (Byte)(_t_>>56); }; 1409 { Elf64_Word _t_ = src->m_info; 1410 (dst)[MP1_info_M0] = (Byte)_t_, 1411 (dst)[MP1_info_M1] = (Byte)(_t_>>8), 1412 (dst)[MP1_info_M2] = (Byte)(_t_>>16), 1413 (dst)[MP1_info_M3] = (Byte)(_t_>>24); }; 1414 { Elf64_Word _t_ = src->m_poffset; 1415 (dst)[MP1_poffset_M0] = (Byte)_t_, 1416 (dst)[MP1_poffset_M1] = (Byte)(_t_>>8), 1417 (dst)[MP1_poffset_M2] = (Byte)(_t_>>16), 1418 (dst)[MP1_poffset_M3] = (Byte)(_t_>>24); }; 1419 { Elf64_Half _t_ = src->m_repeat; 1420 (dst)[MP1_repeat_M0] = (Byte)_t_, 1421 (dst)[MP1_repeat_M1] = (Byte)(_t_>>8); }; 1422 { Elf64_Half _t_ = src->m_stride; 1423 (dst)[MP1_stride_M0] = (Byte)_t_, 1424 (dst)[MP1_stride_M1] = (Byte)(_t_>>8); }; 1425 dst += MP1_sizeof; 1426 } while (++src < end); 1427 } 1428 1429 1430 1431 1432 1433 static void 1434 off_2L_tof(Byte *dst, Elf64_Off *src, size_t cnt) 1435 { 1436 Elf64_Off *end = src + cnt; 1437 1438 do { 1439 { Elf64_Off _t_ = *src; 1440 (dst)[O_L0] = (Byte)_t_, 1441 (dst)[O_L1] = (Byte)(_t_>>8), 1442 (dst)[O_L2] = (Byte)(_t_>>16), 1443 (dst)[O_L3] = (Byte)(_t_>>24), 1444 (dst)[O_L4] = (Byte)(_t_>>32), 1445 (dst)[O_L5] = (Byte)(_t_>>40), 1446 (dst)[O_L6] = (Byte)(_t_>>48), 1447 (dst)[O_L7] = (Byte)(_t_>>56); }; 1448 dst += O_sizeof; 1449 } while (++src < end); 1450 } 1451 1452 static void 1453 off_2M_tof(Byte *dst, Elf64_Off *src, size_t cnt) 1454 { 1455 Elf64_Off *end = src + cnt; 1456 1457 do { 1458 { Elf64_Off _t_ = *src; 1459 (dst)[O_M0] = (Byte)_t_, 1460 (dst)[O_M1] = (Byte)(_t_>>8), 1461 (dst)[O_M2] = (Byte)(_t_>>16), 1462 (dst)[O_M3] = (Byte)(_t_>>24), 1463 (dst)[O_M4] = (Byte)(_t_>>32), 1464 (dst)[O_M5] = (Byte)(_t_>>40), 1465 (dst)[O_M6] = (Byte)(_t_>>48), 1466 (dst)[O_M7] = (Byte)(_t_>>56); }; 1467 dst += O_sizeof; 1468 } while (++src < end); 1469 } 1470 1471 1472 1473 1474 1475 static void 1476 note_2L11_tof(unsigned char *dst, Elf64_Nhdr *src, size_t cnt) 1477 { 1478 /* LINTED */ 1479 Elf64_Nhdr *end = (Elf64_Nhdr *)((char *)src + cnt); 1480 1481 /* 1482 * Copy the note data to the source, translating the 1483 * length fields. Clip against the size of the actual buffer 1484 * to guard against corrupt note data. 1485 */ 1486 do { 1487 Elf64_Word descsz, namesz; 1488 1489 /* 1490 * cache size of desc & name fields - while rounding 1491 * up their size. 1492 */ 1493 namesz = S_ROUND(src->n_namesz, sizeof (Elf64_Word)); 1494 descsz = src->n_descsz; 1495 1496 /* 1497 * Copy contents of Elf64_Nhdr 1498 */ 1499 if ((offsetof(Elf64_Nhdr, n_namesz) + sizeof(Elf64_Word) + 1500 (char *) src) >= (char *) end) 1501 break; 1502 { Elf64_Word _t_ = src->n_namesz; 1503 (dst)[N1_namesz_L0] = (Byte)_t_, 1504 (dst)[N1_namesz_L1] = (Byte)(_t_>>8), 1505 (dst)[N1_namesz_L2] = (Byte)(_t_>>16), 1506 (dst)[N1_namesz_L3] = (Byte)(_t_>>24); }; 1507 1508 if ((offsetof(Elf64_Nhdr, n_descsz) + sizeof(Elf64_Word) + 1509 (char *) src) >= (char *) end) 1510 break; 1511 { Elf64_Word _t_ = src->n_descsz; 1512 (dst)[N1_descsz_L0] = (Byte)_t_, 1513 (dst)[N1_descsz_L1] = (Byte)(_t_>>8), 1514 (dst)[N1_descsz_L2] = (Byte)(_t_>>16), 1515 (dst)[N1_descsz_L3] = (Byte)(_t_>>24); }; 1516 1517 if ((offsetof(Elf64_Nhdr, n_type) + sizeof(Elf64_Word) + 1518 (char *) src) >= (char *) end) 1519 break; 1520 { Elf64_Word _t_ = src->n_type; 1521 (dst)[N1_type_L0] = (Byte)_t_, 1522 (dst)[N1_type_L1] = (Byte)(_t_>>8), 1523 (dst)[N1_type_L2] = (Byte)(_t_>>16), 1524 (dst)[N1_type_L3] = (Byte)(_t_>>24); }; 1525 1526 /* 1527 * Copy contents of Name field 1528 */ 1529 dst += N1_sizeof; 1530 src++; 1531 if ((namesz + (char *) src) > (char *) end) { 1532 namesz = (char *) end - (char *) src; 1533 if (namesz == 0) 1534 break; 1535 } 1536 (void)memcpy(dst, src, namesz); 1537 1538 /* 1539 * Copy contents of desc field 1540 */ 1541 dst += namesz; 1542 src = (Elf64_Nhdr *)((uintptr_t)src + namesz); 1543 if ((descsz + (char *) src) > (char *) end) { 1544 descsz = (char *) end - (char *) src; 1545 if (descsz == 0) 1546 break; 1547 } 1548 (void)memcpy(dst, src, descsz); 1549 1550 descsz = S_ROUND(descsz, sizeof (Elf64_Word)); 1551 dst += descsz; 1552 src = (Elf64_Nhdr *)((uintptr_t)src + descsz); 1553 } while (src < end); 1554 } 1555 1556 static void 1557 note_2M11_tof(unsigned char *dst, Elf64_Nhdr *src, size_t cnt) 1558 { 1559 /* LINTED */ 1560 Elf64_Nhdr *end = (Elf64_Nhdr *)((char *)src + cnt); 1561 1562 /* 1563 * Copy the note data to the source, translating the 1564 * length fields. Clip against the size of the actual buffer 1565 * to guard against corrupt note data. 1566 */ 1567 do { 1568 Elf64_Word descsz, namesz; 1569 1570 /* 1571 * cache size of desc & name fields - while rounding 1572 * up their size. 1573 */ 1574 namesz = S_ROUND(src->n_namesz, sizeof (Elf64_Word)); 1575 descsz = src->n_descsz; 1576 1577 /* 1578 * Copy contents of Elf64_Nhdr 1579 */ 1580 if ((offsetof(Elf64_Nhdr, n_namesz) + sizeof(Elf64_Word) + 1581 (char *) src) >= (char *) end) 1582 break; 1583 { Elf64_Word _t_ = src->n_namesz; 1584 (dst)[N1_namesz_M0] = (Byte)_t_, 1585 (dst)[N1_namesz_M1] = (Byte)(_t_>>8), 1586 (dst)[N1_namesz_M2] = (Byte)(_t_>>16), 1587 (dst)[N1_namesz_M3] = (Byte)(_t_>>24); }; 1588 1589 if ((offsetof(Elf64_Nhdr, n_descsz) + sizeof(Elf64_Word) + 1590 (char *) src) >= (char *) end) 1591 break; 1592 { Elf64_Word _t_ = src->n_descsz; 1593 (dst)[N1_descsz_M0] = (Byte)_t_, 1594 (dst)[N1_descsz_M1] = (Byte)(_t_>>8), 1595 (dst)[N1_descsz_M2] = (Byte)(_t_>>16), 1596 (dst)[N1_descsz_M3] = (Byte)(_t_>>24); }; 1597 1598 if ((offsetof(Elf64_Nhdr, n_type) + sizeof(Elf64_Word) + 1599 (char *) src) >= (char *) end) 1600 break; 1601 { Elf64_Word _t_ = src->n_type; 1602 (dst)[N1_type_M0] = (Byte)_t_, 1603 (dst)[N1_type_M1] = (Byte)(_t_>>8), 1604 (dst)[N1_type_M2] = (Byte)(_t_>>16), 1605 (dst)[N1_type_M3] = (Byte)(_t_>>24); }; 1606 1607 /* 1608 * Copy contents of Name field 1609 */ 1610 dst += N1_sizeof; 1611 src++; 1612 if ((namesz + (char *) src) > (char *) end) { 1613 namesz = (char *) end - (char *) src; 1614 if (namesz == 0) 1615 break; 1616 } 1617 (void)memcpy(dst, src, namesz); 1618 1619 /* 1620 * Copy contents of desc field 1621 */ 1622 dst += namesz; 1623 src = (Elf64_Nhdr *)((uintptr_t)src + namesz); 1624 if ((descsz + (char *) src) > (char *) end) { 1625 descsz = (char *) end - (char *) src; 1626 if (descsz == 0) 1627 break; 1628 } 1629 (void)memcpy(dst, src, descsz); 1630 1631 descsz = S_ROUND(descsz, sizeof (Elf64_Word)); 1632 dst += descsz; 1633 src = (Elf64_Nhdr *)((uintptr_t)src + descsz); 1634 } while (src < end); 1635 } 1636 1637 1638 1639 1640 1641 static void 1642 phdr_2L11_tof(Byte *dst, Elf64_Phdr *src, size_t cnt) 1643 { 1644 Elf64_Phdr *end = src + cnt; 1645 1646 do { 1647 { Elf64_Word _t_ = src->p_type; 1648 (dst)[P1_type_L0] = (Byte)_t_, 1649 (dst)[P1_type_L1] = (Byte)(_t_>>8), 1650 (dst)[P1_type_L2] = (Byte)(_t_>>16), 1651 (dst)[P1_type_L3] = (Byte)(_t_>>24); }; 1652 { Elf64_Word _t_ = src->p_flags; 1653 (dst)[P1_flags_L0] = (Byte)_t_, 1654 (dst)[P1_flags_L1] = (Byte)(_t_>>8), 1655 (dst)[P1_flags_L2] = (Byte)(_t_>>16), 1656 (dst)[P1_flags_L3] = (Byte)(_t_>>24); }; 1657 { Elf64_Off _t_ = src->p_offset; 1658 (dst)[P1_offset_L0] = (Byte)_t_, 1659 (dst)[P1_offset_L1] = (Byte)(_t_>>8), 1660 (dst)[P1_offset_L2] = (Byte)(_t_>>16), 1661 (dst)[P1_offset_L3] = (Byte)(_t_>>24), 1662 (dst)[P1_offset_L4] = (Byte)(_t_>>32), 1663 (dst)[P1_offset_L5] = (Byte)(_t_>>40), 1664 (dst)[P1_offset_L6] = (Byte)(_t_>>48), 1665 (dst)[P1_offset_L7] = (Byte)(_t_>>56); }; 1666 { Elf64_Addr _t_ = src->p_vaddr; 1667 (dst)[P1_vaddr_L0] = (Byte)_t_, 1668 (dst)[P1_vaddr_L1] = (Byte)(_t_>>8), 1669 (dst)[P1_vaddr_L2] = (Byte)(_t_>>16), 1670 (dst)[P1_vaddr_L3] = (Byte)(_t_>>24), 1671 (dst)[P1_vaddr_L4] = (Byte)(_t_>>32), 1672 (dst)[P1_vaddr_L5] = (Byte)(_t_>>40), 1673 (dst)[P1_vaddr_L6] = (Byte)(_t_>>48), 1674 (dst)[P1_vaddr_L7] = (Byte)(_t_>>56); }; 1675 { Elf64_Addr _t_ = src->p_paddr; 1676 (dst)[P1_paddr_L0] = (Byte)_t_, 1677 (dst)[P1_paddr_L1] = (Byte)(_t_>>8), 1678 (dst)[P1_paddr_L2] = (Byte)(_t_>>16), 1679 (dst)[P1_paddr_L3] = (Byte)(_t_>>24), 1680 (dst)[P1_paddr_L4] = (Byte)(_t_>>32), 1681 (dst)[P1_paddr_L5] = (Byte)(_t_>>40), 1682 (dst)[P1_paddr_L6] = (Byte)(_t_>>48), 1683 (dst)[P1_paddr_L7] = (Byte)(_t_>>56); }; 1684 { Elf64_Xword _t_ = src->p_filesz; 1685 (dst)[P1_filesz_L0] = (Byte)_t_, 1686 (dst)[P1_filesz_L1] = (Byte)(_t_>>8), 1687 (dst)[P1_filesz_L2] = (Byte)(_t_>>16), 1688 (dst)[P1_filesz_L3] = (Byte)(_t_>>24), 1689 (dst)[P1_filesz_L4] = (Byte)(_t_>>32), 1690 (dst)[P1_filesz_L5] = (Byte)(_t_>>40), 1691 (dst)[P1_filesz_L6] = (Byte)(_t_>>48), 1692 (dst)[P1_filesz_L7] = (Byte)(_t_>>56); }; 1693 { Elf64_Xword _t_ = src->p_memsz; 1694 (dst)[P1_memsz_L0] = (Byte)_t_, 1695 (dst)[P1_memsz_L1] = (Byte)(_t_>>8), 1696 (dst)[P1_memsz_L2] = (Byte)(_t_>>16), 1697 (dst)[P1_memsz_L3] = (Byte)(_t_>>24), 1698 (dst)[P1_memsz_L4] = (Byte)(_t_>>32), 1699 (dst)[P1_memsz_L5] = (Byte)(_t_>>40), 1700 (dst)[P1_memsz_L6] = (Byte)(_t_>>48), 1701 (dst)[P1_memsz_L7] = (Byte)(_t_>>56); }; 1702 { Elf64_Xword _t_ = src->p_align; 1703 (dst)[P1_align_L0] = (Byte)_t_, 1704 (dst)[P1_align_L1] = (Byte)(_t_>>8), 1705 (dst)[P1_align_L2] = (Byte)(_t_>>16), 1706 (dst)[P1_align_L3] = (Byte)(_t_>>24), 1707 (dst)[P1_align_L4] = (Byte)(_t_>>32), 1708 (dst)[P1_align_L5] = (Byte)(_t_>>40), 1709 (dst)[P1_align_L6] = (Byte)(_t_>>48), 1710 (dst)[P1_align_L7] = (Byte)(_t_>>56); }; 1711 dst += P1_sizeof; 1712 } while (++src < end); 1713 } 1714 1715 static void 1716 phdr_2M11_tof(Byte *dst, Elf64_Phdr *src, size_t cnt) 1717 { 1718 Elf64_Phdr *end = src + cnt; 1719 1720 do { 1721 { Elf64_Word _t_ = src->p_type; 1722 (dst)[P1_type_M0] = (Byte)_t_, 1723 (dst)[P1_type_M1] = (Byte)(_t_>>8), 1724 (dst)[P1_type_M2] = (Byte)(_t_>>16), 1725 (dst)[P1_type_M3] = (Byte)(_t_>>24); }; 1726 { Elf64_Word _t_ = src->p_flags; 1727 (dst)[P1_flags_M0] = (Byte)_t_, 1728 (dst)[P1_flags_M1] = (Byte)(_t_>>8), 1729 (dst)[P1_flags_M2] = (Byte)(_t_>>16), 1730 (dst)[P1_flags_M3] = (Byte)(_t_>>24); }; 1731 { Elf64_Off _t_ = src->p_offset; 1732 (dst)[P1_offset_M0] = (Byte)_t_, 1733 (dst)[P1_offset_M1] = (Byte)(_t_>>8), 1734 (dst)[P1_offset_M2] = (Byte)(_t_>>16), 1735 (dst)[P1_offset_M3] = (Byte)(_t_>>24), 1736 (dst)[P1_offset_M4] = (Byte)(_t_>>32), 1737 (dst)[P1_offset_M5] = (Byte)(_t_>>40), 1738 (dst)[P1_offset_M6] = (Byte)(_t_>>48), 1739 (dst)[P1_offset_M7] = (Byte)(_t_>>56); }; 1740 { Elf64_Addr _t_ = src->p_vaddr; 1741 (dst)[P1_vaddr_M0] = (Byte)_t_, 1742 (dst)[P1_vaddr_M1] = (Byte)(_t_>>8), 1743 (dst)[P1_vaddr_M2] = (Byte)(_t_>>16), 1744 (dst)[P1_vaddr_M3] = (Byte)(_t_>>24), 1745 (dst)[P1_vaddr_M4] = (Byte)(_t_>>32), 1746 (dst)[P1_vaddr_M5] = (Byte)(_t_>>40), 1747 (dst)[P1_vaddr_M6] = (Byte)(_t_>>48), 1748 (dst)[P1_vaddr_M7] = (Byte)(_t_>>56); }; 1749 { Elf64_Addr _t_ = src->p_paddr; 1750 (dst)[P1_paddr_M0] = (Byte)_t_, 1751 (dst)[P1_paddr_M1] = (Byte)(_t_>>8), 1752 (dst)[P1_paddr_M2] = (Byte)(_t_>>16), 1753 (dst)[P1_paddr_M3] = (Byte)(_t_>>24), 1754 (dst)[P1_paddr_M4] = (Byte)(_t_>>32), 1755 (dst)[P1_paddr_M5] = (Byte)(_t_>>40), 1756 (dst)[P1_paddr_M6] = (Byte)(_t_>>48), 1757 (dst)[P1_paddr_M7] = (Byte)(_t_>>56); }; 1758 { Elf64_Xword _t_ = src->p_filesz; 1759 (dst)[P1_filesz_M0] = (Byte)_t_, 1760 (dst)[P1_filesz_M1] = (Byte)(_t_>>8), 1761 (dst)[P1_filesz_M2] = (Byte)(_t_>>16), 1762 (dst)[P1_filesz_M3] = (Byte)(_t_>>24), 1763 (dst)[P1_filesz_M4] = (Byte)(_t_>>32), 1764 (dst)[P1_filesz_M5] = (Byte)(_t_>>40), 1765 (dst)[P1_filesz_M6] = (Byte)(_t_>>48), 1766 (dst)[P1_filesz_M7] = (Byte)(_t_>>56); }; 1767 { Elf64_Xword _t_ = src->p_memsz; 1768 (dst)[P1_memsz_M0] = (Byte)_t_, 1769 (dst)[P1_memsz_M1] = (Byte)(_t_>>8), 1770 (dst)[P1_memsz_M2] = (Byte)(_t_>>16), 1771 (dst)[P1_memsz_M3] = (Byte)(_t_>>24), 1772 (dst)[P1_memsz_M4] = (Byte)(_t_>>32), 1773 (dst)[P1_memsz_M5] = (Byte)(_t_>>40), 1774 (dst)[P1_memsz_M6] = (Byte)(_t_>>48), 1775 (dst)[P1_memsz_M7] = (Byte)(_t_>>56); }; 1776 { Elf64_Xword _t_ = src->p_align; 1777 (dst)[P1_align_M0] = (Byte)_t_, 1778 (dst)[P1_align_M1] = (Byte)(_t_>>8), 1779 (dst)[P1_align_M2] = (Byte)(_t_>>16), 1780 (dst)[P1_align_M3] = (Byte)(_t_>>24), 1781 (dst)[P1_align_M4] = (Byte)(_t_>>32), 1782 (dst)[P1_align_M5] = (Byte)(_t_>>40), 1783 (dst)[P1_align_M6] = (Byte)(_t_>>48), 1784 (dst)[P1_align_M7] = (Byte)(_t_>>56); }; 1785 dst += P1_sizeof; 1786 } while (++src < end); 1787 } 1788 1789 1790 1791 1792 1793 static void 1794 rel_2L11_tof(Byte *dst, Elf64_Rel *src, size_t cnt) 1795 { 1796 Elf64_Rel *end = src + cnt; 1797 1798 do { 1799 { Elf64_Addr _t_ = src->r_offset; 1800 (dst)[R1_offset_L0] = (Byte)_t_, 1801 (dst)[R1_offset_L1] = (Byte)(_t_>>8), 1802 (dst)[R1_offset_L2] = (Byte)(_t_>>16), 1803 (dst)[R1_offset_L3] = (Byte)(_t_>>24), 1804 (dst)[R1_offset_L4] = (Byte)(_t_>>32), 1805 (dst)[R1_offset_L5] = (Byte)(_t_>>40), 1806 (dst)[R1_offset_L6] = (Byte)(_t_>>48), 1807 (dst)[R1_offset_L7] = (Byte)(_t_>>56); }; 1808 { Elf64_Xword _t_ = src->r_info; 1809 (dst)[R1_info_L0] = (Byte)_t_, 1810 (dst)[R1_info_L1] = (Byte)(_t_>>8), 1811 (dst)[R1_info_L2] = (Byte)(_t_>>16), 1812 (dst)[R1_info_L3] = (Byte)(_t_>>24), 1813 (dst)[R1_info_L4] = (Byte)(_t_>>32), 1814 (dst)[R1_info_L5] = (Byte)(_t_>>40), 1815 (dst)[R1_info_L6] = (Byte)(_t_>>48), 1816 (dst)[R1_info_L7] = (Byte)(_t_>>56); }; 1817 dst += R1_sizeof; 1818 } while (++src < end); 1819 } 1820 1821 static void 1822 rel_2M11_tof(Byte *dst, Elf64_Rel *src, size_t cnt) 1823 { 1824 Elf64_Rel *end = src + cnt; 1825 1826 do { 1827 { Elf64_Addr _t_ = src->r_offset; 1828 (dst)[R1_offset_M0] = (Byte)_t_, 1829 (dst)[R1_offset_M1] = (Byte)(_t_>>8), 1830 (dst)[R1_offset_M2] = (Byte)(_t_>>16), 1831 (dst)[R1_offset_M3] = (Byte)(_t_>>24), 1832 (dst)[R1_offset_M4] = (Byte)(_t_>>32), 1833 (dst)[R1_offset_M5] = (Byte)(_t_>>40), 1834 (dst)[R1_offset_M6] = (Byte)(_t_>>48), 1835 (dst)[R1_offset_M7] = (Byte)(_t_>>56); }; 1836 { Elf64_Xword _t_ = src->r_info; 1837 (dst)[R1_info_M0] = (Byte)_t_, 1838 (dst)[R1_info_M1] = (Byte)(_t_>>8), 1839 (dst)[R1_info_M2] = (Byte)(_t_>>16), 1840 (dst)[R1_info_M3] = (Byte)(_t_>>24), 1841 (dst)[R1_info_M4] = (Byte)(_t_>>32), 1842 (dst)[R1_info_M5] = (Byte)(_t_>>40), 1843 (dst)[R1_info_M6] = (Byte)(_t_>>48), 1844 (dst)[R1_info_M7] = (Byte)(_t_>>56); }; 1845 dst += R1_sizeof; 1846 } while (++src < end); 1847 } 1848 1849 1850 1851 1852 1853 static void 1854 rela_2L11_tof(Byte *dst, Elf64_Rela *src, size_t cnt) 1855 { 1856 Elf64_Rela *end = src + cnt; 1857 1858 do { 1859 { Elf64_Addr _t_ = src->r_offset; 1860 (dst)[RA1_offset_L0] = (Byte)_t_, 1861 (dst)[RA1_offset_L1] = (Byte)(_t_>>8), 1862 (dst)[RA1_offset_L2] = (Byte)(_t_>>16), 1863 (dst)[RA1_offset_L3] = (Byte)(_t_>>24), 1864 (dst)[RA1_offset_L4] = (Byte)(_t_>>32), 1865 (dst)[RA1_offset_L5] = (Byte)(_t_>>40), 1866 (dst)[RA1_offset_L6] = (Byte)(_t_>>48), 1867 (dst)[RA1_offset_L7] = (Byte)(_t_>>56); }; 1868 { Elf64_Xword _t_ = src->r_info; 1869 (dst)[RA1_info_L0] = (Byte)_t_, 1870 (dst)[RA1_info_L1] = (Byte)(_t_>>8), 1871 (dst)[RA1_info_L2] = (Byte)(_t_>>16), 1872 (dst)[RA1_info_L3] = (Byte)(_t_>>24), 1873 (dst)[RA1_info_L4] = (Byte)(_t_>>32), 1874 (dst)[RA1_info_L5] = (Byte)(_t_>>40), 1875 (dst)[RA1_info_L6] = (Byte)(_t_>>48), 1876 (dst)[RA1_info_L7] = (Byte)(_t_>>56); }; 1877 /*CONSTANTCONDITION*/ 1878 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1) { /* 2s comp */ 1879 { Elf64_Xword _t_ = src->r_addend; 1880 (dst)[RA1_addend_L0] = (Byte)_t_, 1881 (dst)[RA1_addend_L1] = (Byte)(_t_>>8), 1882 (dst)[RA1_addend_L2] = (Byte)(_t_>>16), 1883 (dst)[RA1_addend_L3] = (Byte)(_t_>>24), 1884 (dst)[RA1_addend_L4] = (Byte)(_t_>>32), 1885 (dst)[RA1_addend_L5] = (Byte)(_t_>>40), 1886 (dst)[RA1_addend_L6] = (Byte)(_t_>>48), 1887 (dst)[RA1_addend_L7] = (Byte)(_t_>>56); }; 1888 } else { 1889 Elf64_Xword w; 1890 1891 if (src->r_addend < 0) { 1892 w = - src->r_addend; 1893 w = ~w + 1; 1894 } else 1895 w = src->r_addend; 1896 { Elf64_Xword _t_ = w; 1897 (dst)[RA1_addend_L0] = (Byte)_t_, 1898 (dst)[RA1_addend_L1] = (Byte)(_t_>>8), 1899 (dst)[RA1_addend_L2] = (Byte)(_t_>>16), 1900 (dst)[RA1_addend_L3] = (Byte)(_t_>>24), 1901 (dst)[RA1_addend_L4] = (Byte)(_t_>>32), 1902 (dst)[RA1_addend_L5] = (Byte)(_t_>>40), 1903 (dst)[RA1_addend_L6] = (Byte)(_t_>>48), 1904 (dst)[RA1_addend_L7] = (Byte)(_t_>>56); }; 1905 } 1906 dst += RA1_sizeof; 1907 } while (++src < end); 1908 } 1909 1910 static void 1911 rela_2M11_tof(Byte *dst, Elf64_Rela *src, size_t cnt) 1912 { 1913 Elf64_Rela *end = src + cnt; 1914 1915 do { 1916 { Elf64_Addr _t_ = src->r_offset; 1917 (dst)[RA1_offset_M0] = (Byte)_t_, 1918 (dst)[RA1_offset_M1] = (Byte)(_t_>>8), 1919 (dst)[RA1_offset_M2] = (Byte)(_t_>>16), 1920 (dst)[RA1_offset_M3] = (Byte)(_t_>>24), 1921 (dst)[RA1_offset_M4] = (Byte)(_t_>>32), 1922 (dst)[RA1_offset_M5] = (Byte)(_t_>>40), 1923 (dst)[RA1_offset_M6] = (Byte)(_t_>>48), 1924 (dst)[RA1_offset_M7] = (Byte)(_t_>>56); }; 1925 { Elf64_Xword _t_ = src->r_info; 1926 (dst)[RA1_info_M0] = (Byte)_t_, 1927 (dst)[RA1_info_M1] = (Byte)(_t_>>8), 1928 (dst)[RA1_info_M2] = (Byte)(_t_>>16), 1929 (dst)[RA1_info_M3] = (Byte)(_t_>>24), 1930 (dst)[RA1_info_M4] = (Byte)(_t_>>32), 1931 (dst)[RA1_info_M5] = (Byte)(_t_>>40), 1932 (dst)[RA1_info_M6] = (Byte)(_t_>>48), 1933 (dst)[RA1_info_M7] = (Byte)(_t_>>56); }; 1934 /*CONSTANTCONDITION*/ 1935 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1) { /* 2s comp */ 1936 { Elf64_Xword _t_ = src->r_addend; 1937 (dst)[RA1_addend_M0] = (Byte)_t_, 1938 (dst)[RA1_addend_M1] = (Byte)(_t_>>8), 1939 (dst)[RA1_addend_M2] = (Byte)(_t_>>16), 1940 (dst)[RA1_addend_M3] = (Byte)(_t_>>24), 1941 (dst)[RA1_addend_M4] = (Byte)(_t_>>32), 1942 (dst)[RA1_addend_M5] = (Byte)(_t_>>40), 1943 (dst)[RA1_addend_M6] = (Byte)(_t_>>48), 1944 (dst)[RA1_addend_M7] = (Byte)(_t_>>56); }; 1945 } else { 1946 Elf64_Xword w; 1947 1948 if (src->r_addend < 0) { 1949 w = - src->r_addend; 1950 w = ~w + 1; 1951 } else 1952 w = src->r_addend; 1953 { Elf64_Xword _t_ = w; 1954 (dst)[RA1_addend_M0] = (Byte)_t_, 1955 (dst)[RA1_addend_M1] = (Byte)(_t_>>8), 1956 (dst)[RA1_addend_M2] = (Byte)(_t_>>16), 1957 (dst)[RA1_addend_M3] = (Byte)(_t_>>24), 1958 (dst)[RA1_addend_M4] = (Byte)(_t_>>32), 1959 (dst)[RA1_addend_M5] = (Byte)(_t_>>40), 1960 (dst)[RA1_addend_M6] = (Byte)(_t_>>48), 1961 (dst)[RA1_addend_M7] = (Byte)(_t_>>56); }; 1962 } 1963 dst += RA1_sizeof; 1964 } while (++src < end); 1965 } 1966 1967 1968 1969 1970 1971 static void 1972 shdr_2L11_tof(Byte *dst, Elf64_Shdr *src, size_t cnt) 1973 { 1974 Elf64_Shdr *end = src + cnt; 1975 1976 do { 1977 { Elf64_Word _t_ = src->sh_name; 1978 (dst)[SH1_name_L0] = (Byte)_t_, 1979 (dst)[SH1_name_L1] = (Byte)(_t_>>8), 1980 (dst)[SH1_name_L2] = (Byte)(_t_>>16), 1981 (dst)[SH1_name_L3] = (Byte)(_t_>>24); }; 1982 { Elf64_Word _t_ = src->sh_type; 1983 (dst)[SH1_type_L0] = (Byte)_t_, 1984 (dst)[SH1_type_L1] = (Byte)(_t_>>8), 1985 (dst)[SH1_type_L2] = (Byte)(_t_>>16), 1986 (dst)[SH1_type_L3] = (Byte)(_t_>>24); }; 1987 { Elf64_Xword _t_ = src->sh_flags; 1988 (dst)[SH1_flags_L0] = (Byte)_t_, 1989 (dst)[SH1_flags_L1] = (Byte)(_t_>>8), 1990 (dst)[SH1_flags_L2] = (Byte)(_t_>>16), 1991 (dst)[SH1_flags_L3] = (Byte)(_t_>>24), 1992 (dst)[SH1_flags_L4] = (Byte)(_t_>>32), 1993 (dst)[SH1_flags_L5] = (Byte)(_t_>>40), 1994 (dst)[SH1_flags_L6] = (Byte)(_t_>>48), 1995 (dst)[SH1_flags_L7] = (Byte)(_t_>>56); }; 1996 { Elf64_Addr _t_ = src->sh_addr; 1997 (dst)[SH1_addr_L0] = (Byte)_t_, 1998 (dst)[SH1_addr_L1] = (Byte)(_t_>>8), 1999 (dst)[SH1_addr_L2] = (Byte)(_t_>>16), 2000 (dst)[SH1_addr_L3] = (Byte)(_t_>>24), 2001 (dst)[SH1_addr_L4] = (Byte)(_t_>>32), 2002 (dst)[SH1_addr_L5] = (Byte)(_t_>>40), 2003 (dst)[SH1_addr_L6] = (Byte)(_t_>>48), 2004 (dst)[SH1_addr_L7] = (Byte)(_t_>>56); }; 2005 { Elf64_Off _t_ = src->sh_offset; 2006 (dst)[SH1_offset_L0] = (Byte)_t_, 2007 (dst)[SH1_offset_L1] = (Byte)(_t_>>8), 2008 (dst)[SH1_offset_L2] = (Byte)(_t_>>16), 2009 (dst)[SH1_offset_L3] = (Byte)(_t_>>24), 2010 (dst)[SH1_offset_L4] = (Byte)(_t_>>32), 2011 (dst)[SH1_offset_L5] = (Byte)(_t_>>40), 2012 (dst)[SH1_offset_L6] = (Byte)(_t_>>48), 2013 (dst)[SH1_offset_L7] = (Byte)(_t_>>56); }; 2014 { Elf64_Xword _t_ = src->sh_size; 2015 (dst)[SH1_size_L0] = (Byte)_t_, 2016 (dst)[SH1_size_L1] = (Byte)(_t_>>8), 2017 (dst)[SH1_size_L2] = (Byte)(_t_>>16), 2018 (dst)[SH1_size_L3] = (Byte)(_t_>>24), 2019 (dst)[SH1_size_L4] = (Byte)(_t_>>32), 2020 (dst)[SH1_size_L5] = (Byte)(_t_>>40), 2021 (dst)[SH1_size_L6] = (Byte)(_t_>>48), 2022 (dst)[SH1_size_L7] = (Byte)(_t_>>56); }; 2023 { Elf64_Word _t_ = src->sh_link; 2024 (dst)[SH1_link_L0] = (Byte)_t_, 2025 (dst)[SH1_link_L1] = (Byte)(_t_>>8), 2026 (dst)[SH1_link_L2] = (Byte)(_t_>>16), 2027 (dst)[SH1_link_L3] = (Byte)(_t_>>24); }; 2028 { Elf64_Word _t_ = src->sh_info; 2029 (dst)[SH1_info_L0] = (Byte)_t_, 2030 (dst)[SH1_info_L1] = (Byte)(_t_>>8), 2031 (dst)[SH1_info_L2] = (Byte)(_t_>>16), 2032 (dst)[SH1_info_L3] = (Byte)(_t_>>24); }; 2033 { Elf64_Xword _t_ = src->sh_addralign; 2034 (dst)[SH1_addralign_L0] = (Byte)_t_, 2035 (dst)[SH1_addralign_L1] = (Byte)(_t_>>8), 2036 (dst)[SH1_addralign_L2] = (Byte)(_t_>>16), 2037 (dst)[SH1_addralign_L3] = (Byte)(_t_>>24), 2038 (dst)[SH1_addralign_L4] = (Byte)(_t_>>32), 2039 (dst)[SH1_addralign_L5] = (Byte)(_t_>>40), 2040 (dst)[SH1_addralign_L6] = (Byte)(_t_>>48), 2041 (dst)[SH1_addralign_L7] = (Byte)(_t_>>56); }; 2042 { Elf64_Xword _t_ = src->sh_entsize; 2043 (dst)[SH1_entsize_L0] = (Byte)_t_, 2044 (dst)[SH1_entsize_L1] = (Byte)(_t_>>8), 2045 (dst)[SH1_entsize_L2] = (Byte)(_t_>>16), 2046 (dst)[SH1_entsize_L3] = (Byte)(_t_>>24), 2047 (dst)[SH1_entsize_L4] = (Byte)(_t_>>32), 2048 (dst)[SH1_entsize_L5] = (Byte)(_t_>>40), 2049 (dst)[SH1_entsize_L6] = (Byte)(_t_>>48), 2050 (dst)[SH1_entsize_L7] = (Byte)(_t_>>56); }; 2051 dst += SH1_sizeof; 2052 } while (++src < end); 2053 } 2054 2055 static void 2056 shdr_2M11_tof(Byte *dst, Elf64_Shdr *src, size_t cnt) 2057 { 2058 Elf64_Shdr *end = src + cnt; 2059 2060 do { 2061 { Elf64_Word _t_ = src->sh_name; 2062 (dst)[SH1_name_M0] = (Byte)_t_, 2063 (dst)[SH1_name_M1] = (Byte)(_t_>>8), 2064 (dst)[SH1_name_M2] = (Byte)(_t_>>16), 2065 (dst)[SH1_name_M3] = (Byte)(_t_>>24); }; 2066 { Elf64_Word _t_ = src->sh_type; 2067 (dst)[SH1_type_M0] = (Byte)_t_, 2068 (dst)[SH1_type_M1] = (Byte)(_t_>>8), 2069 (dst)[SH1_type_M2] = (Byte)(_t_>>16), 2070 (dst)[SH1_type_M3] = (Byte)(_t_>>24); }; 2071 { Elf64_Xword _t_ = src->sh_flags; 2072 (dst)[SH1_flags_M0] = (Byte)_t_, 2073 (dst)[SH1_flags_M1] = (Byte)(_t_>>8), 2074 (dst)[SH1_flags_M2] = (Byte)(_t_>>16), 2075 (dst)[SH1_flags_M3] = (Byte)(_t_>>24), 2076 (dst)[SH1_flags_M4] = (Byte)(_t_>>32), 2077 (dst)[SH1_flags_M5] = (Byte)(_t_>>40), 2078 (dst)[SH1_flags_M6] = (Byte)(_t_>>48), 2079 (dst)[SH1_flags_M7] = (Byte)(_t_>>56); }; 2080 { Elf64_Addr _t_ = src->sh_addr; 2081 (dst)[SH1_addr_M0] = (Byte)_t_, 2082 (dst)[SH1_addr_M1] = (Byte)(_t_>>8), 2083 (dst)[SH1_addr_M2] = (Byte)(_t_>>16), 2084 (dst)[SH1_addr_M3] = (Byte)(_t_>>24), 2085 (dst)[SH1_addr_M4] = (Byte)(_t_>>32), 2086 (dst)[SH1_addr_M5] = (Byte)(_t_>>40), 2087 (dst)[SH1_addr_M6] = (Byte)(_t_>>48), 2088 (dst)[SH1_addr_M7] = (Byte)(_t_>>56); }; 2089 { Elf64_Off _t_ = src->sh_offset; 2090 (dst)[SH1_offset_M0] = (Byte)_t_, 2091 (dst)[SH1_offset_M1] = (Byte)(_t_>>8), 2092 (dst)[SH1_offset_M2] = (Byte)(_t_>>16), 2093 (dst)[SH1_offset_M3] = (Byte)(_t_>>24), 2094 (dst)[SH1_offset_M4] = (Byte)(_t_>>32), 2095 (dst)[SH1_offset_M5] = (Byte)(_t_>>40), 2096 (dst)[SH1_offset_M6] = (Byte)(_t_>>48), 2097 (dst)[SH1_offset_M7] = (Byte)(_t_>>56); }; 2098 { Elf64_Xword _t_ = src->sh_size; 2099 (dst)[SH1_size_M0] = (Byte)_t_, 2100 (dst)[SH1_size_M1] = (Byte)(_t_>>8), 2101 (dst)[SH1_size_M2] = (Byte)(_t_>>16), 2102 (dst)[SH1_size_M3] = (Byte)(_t_>>24), 2103 (dst)[SH1_size_M4] = (Byte)(_t_>>32), 2104 (dst)[SH1_size_M5] = (Byte)(_t_>>40), 2105 (dst)[SH1_size_M6] = (Byte)(_t_>>48), 2106 (dst)[SH1_size_M7] = (Byte)(_t_>>56); }; 2107 { Elf64_Word _t_ = src->sh_link; 2108 (dst)[SH1_link_M0] = (Byte)_t_, 2109 (dst)[SH1_link_M1] = (Byte)(_t_>>8), 2110 (dst)[SH1_link_M2] = (Byte)(_t_>>16), 2111 (dst)[SH1_link_M3] = (Byte)(_t_>>24); }; 2112 { Elf64_Word _t_ = src->sh_info; 2113 (dst)[SH1_info_M0] = (Byte)_t_, 2114 (dst)[SH1_info_M1] = (Byte)(_t_>>8), 2115 (dst)[SH1_info_M2] = (Byte)(_t_>>16), 2116 (dst)[SH1_info_M3] = (Byte)(_t_>>24); }; 2117 { Elf64_Xword _t_ = src->sh_addralign; 2118 (dst)[SH1_addralign_M0] = (Byte)_t_, 2119 (dst)[SH1_addralign_M1] = (Byte)(_t_>>8), 2120 (dst)[SH1_addralign_M2] = (Byte)(_t_>>16), 2121 (dst)[SH1_addralign_M3] = (Byte)(_t_>>24), 2122 (dst)[SH1_addralign_M4] = (Byte)(_t_>>32), 2123 (dst)[SH1_addralign_M5] = (Byte)(_t_>>40), 2124 (dst)[SH1_addralign_M6] = (Byte)(_t_>>48), 2125 (dst)[SH1_addralign_M7] = (Byte)(_t_>>56); }; 2126 { Elf64_Xword _t_ = src->sh_entsize; 2127 (dst)[SH1_entsize_M0] = (Byte)_t_, 2128 (dst)[SH1_entsize_M1] = (Byte)(_t_>>8), 2129 (dst)[SH1_entsize_M2] = (Byte)(_t_>>16), 2130 (dst)[SH1_entsize_M3] = (Byte)(_t_>>24), 2131 (dst)[SH1_entsize_M4] = (Byte)(_t_>>32), 2132 (dst)[SH1_entsize_M5] = (Byte)(_t_>>40), 2133 (dst)[SH1_entsize_M6] = (Byte)(_t_>>48), 2134 (dst)[SH1_entsize_M7] = (Byte)(_t_>>56); }; 2135 dst += SH1_sizeof; 2136 } while (++src < end); 2137 } 2138 2139 2140 2141 2142 2143 static void 2144 sword_2L_tof(Byte *dst, Elf64_Sword *src, size_t cnt) 2145 { 2146 Elf64_Sword *end = src + cnt; 2147 2148 do { 2149 /*CONSTANTCONDITION*/ 2150 if (~(Elf64_Word)0 == -(Elf64_Sword)1) { /* 2s comp */ 2151 { Elf64_Word _t_ = *src; 2152 (dst)[W_L0] = (Byte)_t_, 2153 (dst)[W_L1] = (Byte)(_t_>>8), 2154 (dst)[W_L2] = (Byte)(_t_>>16), 2155 (dst)[W_L3] = (Byte)(_t_>>24); }; 2156 } else { 2157 Elf64_Word w; 2158 2159 if (*src < 0) { 2160 w = - *src; 2161 w = ~w + 1; 2162 } else 2163 w = *src; 2164 { Elf64_Word _t_ = w; 2165 (dst)[W_L0] = (Byte)_t_, 2166 (dst)[W_L1] = (Byte)(_t_>>8), 2167 (dst)[W_L2] = (Byte)(_t_>>16), 2168 (dst)[W_L3] = (Byte)(_t_>>24); }; 2169 } 2170 dst += W_sizeof; 2171 } while (++src < end); 2172 } 2173 2174 static void 2175 sword_2M_tof(Byte *dst, Elf64_Sword *src, size_t cnt) 2176 { 2177 Elf64_Sword *end = src + cnt; 2178 2179 do { 2180 /*CONSTANTCONDITION*/ 2181 if (~(Elf64_Word)0 == -(Elf64_Sword)1) { /* 2s comp */ 2182 { Elf64_Word _t_ = *src; 2183 (dst)[W_M0] = (Byte)_t_, 2184 (dst)[W_M1] = (Byte)(_t_>>8), 2185 (dst)[W_M2] = (Byte)(_t_>>16), 2186 (dst)[W_M3] = (Byte)(_t_>>24); }; 2187 } else { 2188 Elf64_Word w; 2189 2190 if (*src < 0) { 2191 w = - *src; 2192 w = ~w + 1; 2193 } else 2194 w = *src; 2195 { Elf64_Word _t_ = w; 2196 (dst)[W_M0] = (Byte)_t_, 2197 (dst)[W_M1] = (Byte)(_t_>>8), 2198 (dst)[W_M2] = (Byte)(_t_>>16), 2199 (dst)[W_M3] = (Byte)(_t_>>24); }; 2200 } 2201 dst += W_sizeof; 2202 } while (++src < end); 2203 } 2204 2205 2206 2207 2208 2209 static void 2210 cap_2L11_tof(unsigned char *dst, Elf64_Cap *src, size_t cnt) 2211 { 2212 Elf64_Cap *end = src + cnt; 2213 2214 do { 2215 { Elf64_Xword _t_ = src->c_tag; 2216 (dst)[C1_tag_L0] = (Byte)_t_, 2217 (dst)[C1_tag_L1] = (Byte)(_t_>>8), 2218 (dst)[C1_tag_L2] = (Byte)(_t_>>16), 2219 (dst)[C1_tag_L3] = (Byte)(_t_>>24), 2220 (dst)[C1_tag_L4] = (Byte)(_t_>>32), 2221 (dst)[C1_tag_L5] = (Byte)(_t_>>40), 2222 (dst)[C1_tag_L6] = (Byte)(_t_>>48), 2223 (dst)[C1_tag_L7] = (Byte)(_t_>>56); }; 2224 { Elf64_Xword _t_ = src->c_un.c_val; 2225 (dst)[C1_val_L0] = (Byte)_t_, 2226 (dst)[C1_val_L1] = (Byte)(_t_>>8), 2227 (dst)[C1_val_L2] = (Byte)(_t_>>16), 2228 (dst)[C1_val_L3] = (Byte)(_t_>>24), 2229 (dst)[C1_val_L4] = (Byte)(_t_>>32), 2230 (dst)[C1_val_L5] = (Byte)(_t_>>40), 2231 (dst)[C1_val_L6] = (Byte)(_t_>>48), 2232 (dst)[C1_val_L7] = (Byte)(_t_>>56); }; 2233 dst += C1_sizeof; 2234 } while (++src < end); 2235 } 2236 2237 static void 2238 cap_2M11_tof(unsigned char *dst, Elf64_Cap *src, size_t cnt) 2239 { 2240 Elf64_Cap *end = src + cnt; 2241 2242 do { 2243 { Elf64_Xword _t_ = src->c_tag; 2244 (dst)[C1_tag_M0] = (Byte)_t_, 2245 (dst)[C1_tag_M1] = (Byte)(_t_>>8), 2246 (dst)[C1_tag_M2] = (Byte)(_t_>>16), 2247 (dst)[C1_tag_M3] = (Byte)(_t_>>24), 2248 (dst)[C1_tag_M4] = (Byte)(_t_>>32), 2249 (dst)[C1_tag_M5] = (Byte)(_t_>>40), 2250 (dst)[C1_tag_M6] = (Byte)(_t_>>48), 2251 (dst)[C1_tag_M7] = (Byte)(_t_>>56); }; 2252 { Elf64_Xword _t_ = src->c_un.c_val; 2253 (dst)[C1_val_M0] = (Byte)_t_, 2254 (dst)[C1_val_M1] = (Byte)(_t_>>8), 2255 (dst)[C1_val_M2] = (Byte)(_t_>>16), 2256 (dst)[C1_val_M3] = (Byte)(_t_>>24), 2257 (dst)[C1_val_M4] = (Byte)(_t_>>32), 2258 (dst)[C1_val_M5] = (Byte)(_t_>>40), 2259 (dst)[C1_val_M6] = (Byte)(_t_>>48), 2260 (dst)[C1_val_M7] = (Byte)(_t_>>56); }; 2261 dst += C1_sizeof; 2262 } while (++src < end); 2263 } 2264 2265 2266 2267 2268 2269 static void 2270 syminfo_2L11_tof(unsigned char *dst, Elf64_Syminfo *src, size_t cnt) 2271 { 2272 Elf64_Syminfo *end = src + cnt; 2273 2274 do { 2275 { Elf64_Half _t_ = src->si_boundto; 2276 (dst)[SI1_boundto_L0] = (Byte)_t_, 2277 (dst)[SI1_boundto_L1] = (Byte)(_t_>>8); }; 2278 { Elf64_Half _t_ = src->si_flags; 2279 (dst)[SI1_flags_L0] = (Byte)_t_, 2280 (dst)[SI1_flags_L1] = (Byte)(_t_>>8); }; 2281 dst += SI1_sizeof; 2282 } while (++src < end); 2283 } 2284 2285 static void 2286 syminfo_2M11_tof(unsigned char *dst, Elf64_Syminfo *src, size_t cnt) 2287 { 2288 Elf64_Syminfo *end = src + cnt; 2289 2290 do { 2291 { Elf64_Half _t_ = src->si_boundto; 2292 (dst)[SI1_boundto_M0] = (Byte)_t_, 2293 (dst)[SI1_boundto_M1] = (Byte)(_t_>>8); }; 2294 { Elf64_Half _t_ = src->si_flags; 2295 (dst)[SI1_flags_M0] = (Byte)_t_, 2296 (dst)[SI1_flags_M1] = (Byte)(_t_>>8); }; 2297 dst += SI1_sizeof; 2298 } while (++src < end); 2299 } 2300 2301 2302 2303 2304 2305 static void 2306 sym_2L11_tof(Byte *dst, Elf64_Sym *src, size_t cnt) 2307 { 2308 Elf64_Sym *end = src + cnt; 2309 2310 do { 2311 { Elf64_Word _t_ = src->st_name; 2312 (dst)[ST1_name_L0] = (Byte)_t_, 2313 (dst)[ST1_name_L1] = (Byte)(_t_>>8), 2314 (dst)[ST1_name_L2] = (Byte)(_t_>>16), 2315 (dst)[ST1_name_L3] = (Byte)(_t_>>24); }; 2316 (dst)[ST1_info_L] = (Byte)(src->st_info); 2317 (dst)[ST1_other_L] = (Byte)(src->st_other); 2318 { Elf64_Half _t_ = src->st_shndx; 2319 (dst)[ST1_shndx_L0] = (Byte)_t_, 2320 (dst)[ST1_shndx_L1] = (Byte)(_t_>>8); }; 2321 { Elf64_Addr _t_ = src->st_value; 2322 (dst)[ST1_value_L0] = (Byte)_t_, 2323 (dst)[ST1_value_L1] = (Byte)(_t_>>8), 2324 (dst)[ST1_value_L2] = (Byte)(_t_>>16), 2325 (dst)[ST1_value_L3] = (Byte)(_t_>>24), 2326 (dst)[ST1_value_L4] = (Byte)(_t_>>32), 2327 (dst)[ST1_value_L5] = (Byte)(_t_>>40), 2328 (dst)[ST1_value_L6] = (Byte)(_t_>>48), 2329 (dst)[ST1_value_L7] = (Byte)(_t_>>56); }; 2330 { Elf64_Xword _t_ = src->st_size; 2331 (dst)[ST1_size_L0] = (Byte)_t_, 2332 (dst)[ST1_size_L1] = (Byte)(_t_>>8), 2333 (dst)[ST1_size_L2] = (Byte)(_t_>>16), 2334 (dst)[ST1_size_L3] = (Byte)(_t_>>24), 2335 (dst)[ST1_size_L4] = (Byte)(_t_>>32), 2336 (dst)[ST1_size_L5] = (Byte)(_t_>>40), 2337 (dst)[ST1_size_L6] = (Byte)(_t_>>48), 2338 (dst)[ST1_size_L7] = (Byte)(_t_>>56); }; 2339 dst += ST1_sizeof; 2340 } while (++src < end); 2341 } 2342 2343 static void 2344 sym_2M11_tof(Byte *dst, Elf64_Sym *src, size_t cnt) 2345 { 2346 Elf64_Sym *end = src + cnt; 2347 2348 do { 2349 { Elf64_Word _t_ = src->st_name; 2350 (dst)[ST1_name_M0] = (Byte)_t_, 2351 (dst)[ST1_name_M1] = (Byte)(_t_>>8), 2352 (dst)[ST1_name_M2] = (Byte)(_t_>>16), 2353 (dst)[ST1_name_M3] = (Byte)(_t_>>24); }; 2354 (dst)[ST1_info_M] = (Byte)(src->st_info); 2355 (dst)[ST1_other_M] = (Byte)(src->st_other); 2356 { Elf64_Half _t_ = src->st_shndx; 2357 (dst)[ST1_shndx_M0] = (Byte)_t_, 2358 (dst)[ST1_shndx_M1] = (Byte)(_t_>>8); }; 2359 { Elf64_Addr _t_ = src->st_value; 2360 (dst)[ST1_value_M0] = (Byte)_t_, 2361 (dst)[ST1_value_M1] = (Byte)(_t_>>8), 2362 (dst)[ST1_value_M2] = (Byte)(_t_>>16), 2363 (dst)[ST1_value_M3] = (Byte)(_t_>>24), 2364 (dst)[ST1_value_M4] = (Byte)(_t_>>32), 2365 (dst)[ST1_value_M5] = (Byte)(_t_>>40), 2366 (dst)[ST1_value_M6] = (Byte)(_t_>>48), 2367 (dst)[ST1_value_M7] = (Byte)(_t_>>56); }; 2368 { Elf64_Xword _t_ = src->st_size; 2369 (dst)[ST1_size_M0] = (Byte)_t_, 2370 (dst)[ST1_size_M1] = (Byte)(_t_>>8), 2371 (dst)[ST1_size_M2] = (Byte)(_t_>>16), 2372 (dst)[ST1_size_M3] = (Byte)(_t_>>24), 2373 (dst)[ST1_size_M4] = (Byte)(_t_>>32), 2374 (dst)[ST1_size_M5] = (Byte)(_t_>>40), 2375 (dst)[ST1_size_M6] = (Byte)(_t_>>48), 2376 (dst)[ST1_size_M7] = (Byte)(_t_>>56); }; 2377 dst += ST1_sizeof; 2378 } while (++src < end); 2379 } 2380 2381 2382 2383 2384 2385 static void 2386 word_2L_tof(Byte *dst, Elf64_Word *src, size_t cnt) 2387 { 2388 Elf64_Word *end = src + cnt; 2389 2390 do { 2391 { Elf64_Word _t_ = *src; 2392 (dst)[W_L0] = (Byte)_t_, 2393 (dst)[W_L1] = (Byte)(_t_>>8), 2394 (dst)[W_L2] = (Byte)(_t_>>16), 2395 (dst)[W_L3] = (Byte)(_t_>>24); }; 2396 dst += W_sizeof; 2397 } while (++src < end); 2398 } 2399 2400 static void 2401 word_2M_tof(Byte *dst, Elf64_Word *src, size_t cnt) 2402 { 2403 Elf64_Word *end = src + cnt; 2404 2405 do { 2406 { Elf64_Word _t_ = *src; 2407 (dst)[W_M0] = (Byte)_t_, 2408 (dst)[W_M1] = (Byte)(_t_>>8), 2409 (dst)[W_M2] = (Byte)(_t_>>16), 2410 (dst)[W_M3] = (Byte)(_t_>>24); }; 2411 dst += W_sizeof; 2412 } while (++src < end); 2413 } 2414 2415 2416 2417 2418 2419 static void 2420 verdef_2L11_tof(Byte *dst, Elf64_Verdef *src, size_t cnt) 2421 { 2422 /* LINTED */ 2423 Elf64_Verdef *end = (Elf64_Verdef *)((Byte *)src + cnt); 2424 2425 do { 2426 Elf64_Verdef *next_verdef; 2427 Elf64_Verdaux *vaux; 2428 Elf64_Half i; 2429 Byte *vaux_dst; 2430 Byte *dst_next; 2431 2432 /* LINTED */ 2433 next_verdef = (Elf64_Verdef *)(src->vd_next ? 2434 (Byte *)src + src->vd_next : (Byte *)end); 2435 dst_next = dst + src->vd_next; 2436 2437 /* LINTED */ 2438 vaux = (Elf64_Verdaux *)((Byte *)src + src->vd_aux); 2439 vaux_dst = dst + src->vd_aux; 2440 2441 /* 2442 * Convert auxilary structures 2443 */ 2444 for (i = 0; i < src->vd_cnt; i++) { 2445 Elf64_Verdaux *vaux_next; 2446 Byte *vaux_dst_next; 2447 2448 /* 2449 * because our source and destination can be 2450 * the same place we need to figure out the next 2451 * location now. 2452 */ 2453 /* LINTED */ 2454 vaux_next = (Elf64_Verdaux *)((Byte *)vaux + 2455 vaux->vda_next); 2456 vaux_dst_next = vaux_dst + vaux->vda_next; 2457 2458 { Elf64_Word _t_ = vaux->vda_name; 2459 (vaux_dst)[VDA1_name_L0] = (Byte)_t_, 2460 (vaux_dst)[VDA1_name_L1] = (Byte)(_t_>>8), 2461 (vaux_dst)[VDA1_name_L2] = (Byte)(_t_>>16), 2462 (vaux_dst)[VDA1_name_L3] = (Byte)(_t_>>24); }; 2463 { Elf64_Word _t_ = vaux->vda_next; 2464 (vaux_dst)[VDA1_next_L0] = (Byte)_t_, 2465 (vaux_dst)[VDA1_next_L1] = (Byte)(_t_>>8), 2466 (vaux_dst)[VDA1_next_L2] = (Byte)(_t_>>16), 2467 (vaux_dst)[VDA1_next_L3] = (Byte)(_t_>>24); }; 2468 vaux_dst = vaux_dst_next; 2469 vaux = vaux_next; 2470 } 2471 2472 /* 2473 * Convert Elf64_Verdef structure. 2474 */ 2475 { Elf64_Half _t_ = src->vd_version; 2476 (dst)[VD1_version_L0] = (Byte)_t_, 2477 (dst)[VD1_version_L1] = (Byte)(_t_>>8); }; 2478 { Elf64_Half _t_ = src->vd_flags; 2479 (dst)[VD1_flags_L0] = (Byte)_t_, 2480 (dst)[VD1_flags_L1] = (Byte)(_t_>>8); }; 2481 { Elf64_Half _t_ = src->vd_ndx; 2482 (dst)[VD1_ndx_L0] = (Byte)_t_, 2483 (dst)[VD1_ndx_L1] = (Byte)(_t_>>8); }; 2484 { Elf64_Half _t_ = src->vd_cnt; 2485 (dst)[VD1_cnt_L0] = (Byte)_t_, 2486 (dst)[VD1_cnt_L1] = (Byte)(_t_>>8); }; 2487 { Elf64_Word _t_ = src->vd_hash; 2488 (dst)[VD1_hash_L0] = (Byte)_t_, 2489 (dst)[VD1_hash_L1] = (Byte)(_t_>>8), 2490 (dst)[VD1_hash_L2] = (Byte)(_t_>>16), 2491 (dst)[VD1_hash_L3] = (Byte)(_t_>>24); }; 2492 { Elf64_Word _t_ = src->vd_aux; 2493 (dst)[VD1_aux_L0] = (Byte)_t_, 2494 (dst)[VD1_aux_L1] = (Byte)(_t_>>8), 2495 (dst)[VD1_aux_L2] = (Byte)(_t_>>16), 2496 (dst)[VD1_aux_L3] = (Byte)(_t_>>24); }; 2497 { Elf64_Word _t_ = src->vd_next; 2498 (dst)[VD1_next_L0] = (Byte)_t_, 2499 (dst)[VD1_next_L1] = (Byte)(_t_>>8), 2500 (dst)[VD1_next_L2] = (Byte)(_t_>>16), 2501 (dst)[VD1_next_L3] = (Byte)(_t_>>24); }; 2502 src = next_verdef; 2503 dst = dst_next; 2504 } while (src < end); 2505 } 2506 2507 static void 2508 verdef_2M11_tof(Byte *dst, Elf64_Verdef *src, size_t cnt) 2509 { 2510 /* LINTED */ 2511 Elf64_Verdef *end = (Elf64_Verdef *)((Byte *)src + cnt); 2512 2513 do { 2514 Elf64_Verdef *next_verdef; 2515 Elf64_Verdaux *vaux; 2516 Elf64_Half i; 2517 Byte *vaux_dst; 2518 Byte *dst_next; 2519 2520 /* LINTED */ 2521 next_verdef = (Elf64_Verdef *)(src->vd_next ? 2522 (Byte *)src + src->vd_next : (Byte *)end); 2523 dst_next = dst + src->vd_next; 2524 2525 /* LINTED */ 2526 vaux = (Elf64_Verdaux *)((Byte *)src + src->vd_aux); 2527 vaux_dst = dst + src->vd_aux; 2528 2529 /* 2530 * Convert auxilary structures 2531 */ 2532 for (i = 0; i < src->vd_cnt; i++) { 2533 Elf64_Verdaux *vaux_next; 2534 Byte *vaux_dst_next; 2535 2536 /* 2537 * because our source and destination can be 2538 * the same place we need to figure out the next 2539 * location now. 2540 */ 2541 /* LINTED */ 2542 vaux_next = (Elf64_Verdaux *)((Byte *)vaux + 2543 vaux->vda_next); 2544 vaux_dst_next = vaux_dst + vaux->vda_next; 2545 2546 { Elf64_Word _t_ = vaux->vda_name; 2547 (vaux_dst)[VDA1_name_M0] = (Byte)_t_, 2548 (vaux_dst)[VDA1_name_M1] = (Byte)(_t_>>8), 2549 (vaux_dst)[VDA1_name_M2] = (Byte)(_t_>>16), 2550 (vaux_dst)[VDA1_name_M3] = (Byte)(_t_>>24); }; 2551 { Elf64_Word _t_ = vaux->vda_next; 2552 (vaux_dst)[VDA1_next_M0] = (Byte)_t_, 2553 (vaux_dst)[VDA1_next_M1] = (Byte)(_t_>>8), 2554 (vaux_dst)[VDA1_next_M2] = (Byte)(_t_>>16), 2555 (vaux_dst)[VDA1_next_M3] = (Byte)(_t_>>24); }; 2556 vaux_dst = vaux_dst_next; 2557 vaux = vaux_next; 2558 } 2559 2560 /* 2561 * Convert Elf64_Verdef structure. 2562 */ 2563 { Elf64_Half _t_ = src->vd_version; 2564 (dst)[VD1_version_M0] = (Byte)_t_, 2565 (dst)[VD1_version_M1] = (Byte)(_t_>>8); }; 2566 { Elf64_Half _t_ = src->vd_flags; 2567 (dst)[VD1_flags_M0] = (Byte)_t_, 2568 (dst)[VD1_flags_M1] = (Byte)(_t_>>8); }; 2569 { Elf64_Half _t_ = src->vd_ndx; 2570 (dst)[VD1_ndx_M0] = (Byte)_t_, 2571 (dst)[VD1_ndx_M1] = (Byte)(_t_>>8); }; 2572 { Elf64_Half _t_ = src->vd_cnt; 2573 (dst)[VD1_cnt_M0] = (Byte)_t_, 2574 (dst)[VD1_cnt_M1] = (Byte)(_t_>>8); }; 2575 { Elf64_Word _t_ = src->vd_hash; 2576 (dst)[VD1_hash_M0] = (Byte)_t_, 2577 (dst)[VD1_hash_M1] = (Byte)(_t_>>8), 2578 (dst)[VD1_hash_M2] = (Byte)(_t_>>16), 2579 (dst)[VD1_hash_M3] = (Byte)(_t_>>24); }; 2580 { Elf64_Word _t_ = src->vd_aux; 2581 (dst)[VD1_aux_M0] = (Byte)_t_, 2582 (dst)[VD1_aux_M1] = (Byte)(_t_>>8), 2583 (dst)[VD1_aux_M2] = (Byte)(_t_>>16), 2584 (dst)[VD1_aux_M3] = (Byte)(_t_>>24); }; 2585 { Elf64_Word _t_ = src->vd_next; 2586 (dst)[VD1_next_M0] = (Byte)_t_, 2587 (dst)[VD1_next_M1] = (Byte)(_t_>>8), 2588 (dst)[VD1_next_M2] = (Byte)(_t_>>16), 2589 (dst)[VD1_next_M3] = (Byte)(_t_>>24); }; 2590 src = next_verdef; 2591 dst = dst_next; 2592 } while (src < end); 2593 } 2594 2595 2596 2597 2598 static void 2599 verneed_2L11_tof(Byte *dst, Elf64_Verneed *src, size_t cnt) 2600 { 2601 /* LINTED */ 2602 Elf64_Verneed *end = (Elf64_Verneed *)((char *)src + cnt); 2603 2604 do { 2605 Elf64_Verneed * next_verneed; 2606 Elf64_Vernaux * vaux; 2607 Elf64_Half i; 2608 Byte * vaux_dst; 2609 Byte * dst_next; 2610 2611 /* LINTED */ 2612 next_verneed = (Elf64_Verneed *)(src->vn_next ? 2613 (Byte *)src + src->vn_next : (Byte *)end); 2614 dst_next = dst + src->vn_next; 2615 2616 /* LINTED */ 2617 vaux = (Elf64_Vernaux *)((Byte *)src + src->vn_aux); 2618 vaux_dst = dst + src->vn_aux; 2619 2620 /* 2621 * Convert auxilary structures first 2622 */ 2623 for (i = 0; i < src->vn_cnt; i++) { 2624 Elf64_Vernaux *vaux_next; 2625 Byte *vaux_dst_next; 2626 2627 /* 2628 * because our source and destination can be 2629 * the same place we need to figure out the 2630 * next location now. 2631 */ 2632 /* LINTED */ 2633 vaux_next = (Elf64_Vernaux *)((Byte *)vaux + 2634 vaux->vna_next); 2635 vaux_dst_next = vaux_dst + vaux->vna_next; 2636 2637 { Elf64_Word _t_ = vaux->vna_hash; 2638 (vaux_dst)[VNA1_hash_L0] = (Byte)_t_, 2639 (vaux_dst)[VNA1_hash_L1] = (Byte)(_t_>>8), 2640 (vaux_dst)[VNA1_hash_L2] = (Byte)(_t_>>16), 2641 (vaux_dst)[VNA1_hash_L3] = (Byte)(_t_>>24); }; 2642 { Elf64_Half _t_ = vaux->vna_flags; 2643 (vaux_dst)[VNA1_flags_L0] = (Byte)_t_, 2644 (vaux_dst)[VNA1_flags_L1] = (Byte)(_t_>>8); }; 2645 { Elf64_Half _t_ = vaux->vna_other; 2646 (vaux_dst)[VNA1_other_L0] = (Byte)_t_, 2647 (vaux_dst)[VNA1_other_L1] = (Byte)(_t_>>8); }; 2648 { Elf64_Word _t_ = vaux->vna_name; 2649 (vaux_dst)[VNA1_name_L0] = (Byte)_t_, 2650 (vaux_dst)[VNA1_name_L1] = (Byte)(_t_>>8), 2651 (vaux_dst)[VNA1_name_L2] = (Byte)(_t_>>16), 2652 (vaux_dst)[VNA1_name_L3] = (Byte)(_t_>>24); }; 2653 { Elf64_Word _t_ = vaux->vna_next; 2654 (vaux_dst)[VNA1_next_L0] = (Byte)_t_, 2655 (vaux_dst)[VNA1_next_L1] = (Byte)(_t_>>8), 2656 (vaux_dst)[VNA1_next_L2] = (Byte)(_t_>>16), 2657 (vaux_dst)[VNA1_next_L3] = (Byte)(_t_>>24); }; 2658 vaux_dst = vaux_dst_next; 2659 vaux = vaux_next; 2660 } 2661 2662 /* 2663 * Convert Elf64_Verneed structure. 2664 */ 2665 { Elf64_Half _t_ = src->vn_version; 2666 (dst)[VN1_version_L0] = (Byte)_t_, 2667 (dst)[VN1_version_L1] = (Byte)(_t_>>8); }; 2668 { Elf64_Half _t_ = src->vn_cnt; 2669 (dst)[VN1_cnt_L0] = (Byte)_t_, 2670 (dst)[VN1_cnt_L1] = (Byte)(_t_>>8); }; 2671 { Elf64_Word _t_ = src->vn_file; 2672 (dst)[VN1_file_L0] = (Byte)_t_, 2673 (dst)[VN1_file_L1] = (Byte)(_t_>>8), 2674 (dst)[VN1_file_L2] = (Byte)(_t_>>16), 2675 (dst)[VN1_file_L3] = (Byte)(_t_>>24); }; 2676 { Elf64_Word _t_ = src->vn_aux; 2677 (dst)[VN1_aux_L0] = (Byte)_t_, 2678 (dst)[VN1_aux_L1] = (Byte)(_t_>>8), 2679 (dst)[VN1_aux_L2] = (Byte)(_t_>>16), 2680 (dst)[VN1_aux_L3] = (Byte)(_t_>>24); }; 2681 { Elf64_Word _t_ = src->vn_next; 2682 (dst)[VN1_next_L0] = (Byte)_t_, 2683 (dst)[VN1_next_L1] = (Byte)(_t_>>8), 2684 (dst)[VN1_next_L2] = (Byte)(_t_>>16), 2685 (dst)[VN1_next_L3] = (Byte)(_t_>>24); }; 2686 src = next_verneed; 2687 dst = dst_next; 2688 } while (src < end); 2689 } 2690 2691 static void 2692 verneed_2M11_tof(Byte *dst, Elf64_Verneed *src, size_t cnt) 2693 { 2694 /* LINTED */ 2695 Elf64_Verneed *end = (Elf64_Verneed *)((char *)src + cnt); 2696 2697 do { 2698 Elf64_Verneed * next_verneed; 2699 Elf64_Vernaux * vaux; 2700 Elf64_Half i; 2701 Byte * vaux_dst; 2702 Byte * dst_next; 2703 2704 /* LINTED */ 2705 next_verneed = (Elf64_Verneed *)(src->vn_next ? 2706 (Byte *)src + src->vn_next : (Byte *)end); 2707 dst_next = dst + src->vn_next; 2708 2709 /* LINTED */ 2710 vaux = (Elf64_Vernaux *)((Byte *)src + src->vn_aux); 2711 vaux_dst = dst + src->vn_aux; 2712 2713 /* 2714 * Convert auxilary structures first 2715 */ 2716 for (i = 0; i < src->vn_cnt; i++) { 2717 Elf64_Vernaux *vaux_next; 2718 Byte *vaux_dst_next; 2719 2720 /* 2721 * because our source and destination can be 2722 * the same place we need to figure out the 2723 * next location now. 2724 */ 2725 /* LINTED */ 2726 vaux_next = (Elf64_Vernaux *)((Byte *)vaux + 2727 vaux->vna_next); 2728 vaux_dst_next = vaux_dst + vaux->vna_next; 2729 2730 { Elf64_Word _t_ = vaux->vna_hash; 2731 (vaux_dst)[VNA1_hash_M0] = (Byte)_t_, 2732 (vaux_dst)[VNA1_hash_M1] = (Byte)(_t_>>8), 2733 (vaux_dst)[VNA1_hash_M2] = (Byte)(_t_>>16), 2734 (vaux_dst)[VNA1_hash_M3] = (Byte)(_t_>>24); }; 2735 { Elf64_Half _t_ = vaux->vna_flags; 2736 (vaux_dst)[VNA1_flags_M0] = (Byte)_t_, 2737 (vaux_dst)[VNA1_flags_M1] = (Byte)(_t_>>8); }; 2738 { Elf64_Half _t_ = vaux->vna_other; 2739 (vaux_dst)[VNA1_other_M0] = (Byte)_t_, 2740 (vaux_dst)[VNA1_other_M1] = (Byte)(_t_>>8); }; 2741 { Elf64_Word _t_ = vaux->vna_name; 2742 (vaux_dst)[VNA1_name_M0] = (Byte)_t_, 2743 (vaux_dst)[VNA1_name_M1] = (Byte)(_t_>>8), 2744 (vaux_dst)[VNA1_name_M2] = (Byte)(_t_>>16), 2745 (vaux_dst)[VNA1_name_M3] = (Byte)(_t_>>24); }; 2746 { Elf64_Word _t_ = vaux->vna_next; 2747 (vaux_dst)[VNA1_next_M0] = (Byte)_t_, 2748 (vaux_dst)[VNA1_next_M1] = (Byte)(_t_>>8), 2749 (vaux_dst)[VNA1_next_M2] = (Byte)(_t_>>16), 2750 (vaux_dst)[VNA1_next_M3] = (Byte)(_t_>>24); }; 2751 vaux_dst = vaux_dst_next; 2752 vaux = vaux_next; 2753 } 2754 2755 /* 2756 * Convert Elf64_Verneed structure. 2757 */ 2758 { Elf64_Half _t_ = src->vn_version; 2759 (dst)[VN1_version_M0] = (Byte)_t_, 2760 (dst)[VN1_version_M1] = (Byte)(_t_>>8); }; 2761 { Elf64_Half _t_ = src->vn_cnt; 2762 (dst)[VN1_cnt_M0] = (Byte)_t_, 2763 (dst)[VN1_cnt_M1] = (Byte)(_t_>>8); }; 2764 { Elf64_Word _t_ = src->vn_file; 2765 (dst)[VN1_file_M0] = (Byte)_t_, 2766 (dst)[VN1_file_M1] = (Byte)(_t_>>8), 2767 (dst)[VN1_file_M2] = (Byte)(_t_>>16), 2768 (dst)[VN1_file_M3] = (Byte)(_t_>>24); }; 2769 { Elf64_Word _t_ = src->vn_aux; 2770 (dst)[VN1_aux_M0] = (Byte)_t_, 2771 (dst)[VN1_aux_M1] = (Byte)(_t_>>8), 2772 (dst)[VN1_aux_M2] = (Byte)(_t_>>16), 2773 (dst)[VN1_aux_M3] = (Byte)(_t_>>24); }; 2774 { Elf64_Word _t_ = src->vn_next; 2775 (dst)[VN1_next_M0] = (Byte)_t_, 2776 (dst)[VN1_next_M1] = (Byte)(_t_>>8), 2777 (dst)[VN1_next_M2] = (Byte)(_t_>>16), 2778 (dst)[VN1_next_M3] = (Byte)(_t_>>24); }; 2779 src = next_verneed; 2780 dst = dst_next; 2781 } while (src < end); 2782 } 2783 2784 2785 2786 2787 2788 static void 2789 sxword_2L_tof(Byte *dst, Elf64_Sxword *src, size_t cnt) 2790 { 2791 Elf64_Sxword *end = src + cnt; 2792 2793 do { 2794 /*CONSTANTCONDITION*/ 2795 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1) { /* 2s comp */ 2796 { Elf64_Xword _t_ = *src; 2797 (dst)[X_L0] = (Byte)_t_, 2798 (dst)[X_L1] = (Byte)(_t_>>8), 2799 (dst)[X_L2] = (Byte)(_t_>>16), 2800 (dst)[X_L3] = (Byte)(_t_>>24), 2801 (dst)[X_L4] = (Byte)(_t_>>32), 2802 (dst)[X_L5] = (Byte)(_t_>>40), 2803 (dst)[X_L6] = (Byte)(_t_>>48), 2804 (dst)[X_L7] = (Byte)(_t_>>56); }; 2805 } 2806 else { /* unknown */ 2807 Elf64_Xword w; 2808 2809 if (*src < 0) { 2810 w = - *src; 2811 w = ~w + 1; 2812 } else 2813 w = *src; 2814 { Elf64_Xword _t_ = w; 2815 (dst)[X_L0] = (Byte)_t_, 2816 (dst)[X_L1] = (Byte)(_t_>>8), 2817 (dst)[X_L2] = (Byte)(_t_>>16), 2818 (dst)[X_L3] = (Byte)(_t_>>24), 2819 (dst)[X_L4] = (Byte)(_t_>>32), 2820 (dst)[X_L5] = (Byte)(_t_>>40), 2821 (dst)[X_L6] = (Byte)(_t_>>48), 2822 (dst)[X_L7] = (Byte)(_t_>>56); }; 2823 } 2824 dst += X_sizeof; 2825 } while (++src < end); 2826 } 2827 2828 static void 2829 sxword_2M_tof(Byte *dst, Elf64_Sxword *src, size_t cnt) 2830 { 2831 Elf64_Sxword *end = src + cnt; 2832 2833 do { 2834 /*CONSTANTCONDITION*/ 2835 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1) { /* 2s comp */ 2836 { Elf64_Xword _t_ = *src; 2837 (dst)[X_M0] = (Byte)_t_, 2838 (dst)[X_M1] = (Byte)(_t_>>8), 2839 (dst)[X_M2] = (Byte)(_t_>>16), 2840 (dst)[X_M3] = (Byte)(_t_>>24), 2841 (dst)[X_M4] = (Byte)(_t_>>32), 2842 (dst)[X_M5] = (Byte)(_t_>>40), 2843 (dst)[X_M6] = (Byte)(_t_>>48), 2844 (dst)[X_M7] = (Byte)(_t_>>56); }; 2845 } 2846 else { /* unknown */ 2847 Elf64_Xword w; 2848 2849 if (*src < 0) { 2850 w = - *src; 2851 w = ~w + 1; 2852 } else 2853 w = *src; 2854 { Elf64_Xword _t_ = w; 2855 (dst)[X_M0] = (Byte)_t_, 2856 (dst)[X_M1] = (Byte)(_t_>>8), 2857 (dst)[X_M2] = (Byte)(_t_>>16), 2858 (dst)[X_M3] = (Byte)(_t_>>24), 2859 (dst)[X_M4] = (Byte)(_t_>>32), 2860 (dst)[X_M5] = (Byte)(_t_>>40), 2861 (dst)[X_M6] = (Byte)(_t_>>48), 2862 (dst)[X_M7] = (Byte)(_t_>>56); }; 2863 } 2864 dst += X_sizeof; 2865 } while (++src < end); 2866 } 2867 2868 2869 2870 2871 2872 static void 2873 xword_2L_tof(Byte *dst, Elf64_Xword *src, size_t cnt) 2874 { 2875 Elf64_Xword *end = src + cnt; 2876 2877 do { 2878 { Elf64_Xword _t_ = *src; 2879 (dst)[X_L0] = (Byte)_t_, 2880 (dst)[X_L1] = (Byte)(_t_>>8), 2881 (dst)[X_L2] = (Byte)(_t_>>16), 2882 (dst)[X_L3] = (Byte)(_t_>>24), 2883 (dst)[X_L4] = (Byte)(_t_>>32), 2884 (dst)[X_L5] = (Byte)(_t_>>40), 2885 (dst)[X_L6] = (Byte)(_t_>>48), 2886 (dst)[X_L7] = (Byte)(_t_>>56); }; 2887 dst += X_sizeof; 2888 } while (++src < end); 2889 } 2890 2891 static void 2892 xword_2M_tof(Byte *dst, Elf64_Xword *src, size_t cnt) 2893 { 2894 Elf64_Xword *end = src + cnt; 2895 2896 do { 2897 { Elf64_Xword _t_ = *src; 2898 (dst)[X_M0] = (Byte)_t_, 2899 (dst)[X_M1] = (Byte)(_t_>>8), 2900 (dst)[X_M2] = (Byte)(_t_>>16), 2901 (dst)[X_M3] = (Byte)(_t_>>24), 2902 (dst)[X_M4] = (Byte)(_t_>>32), 2903 (dst)[X_M5] = (Byte)(_t_>>40), 2904 (dst)[X_M6] = (Byte)(_t_>>48), 2905 (dst)[X_M7] = (Byte)(_t_>>56); }; 2906 dst += X_sizeof; 2907 } while (++src < end); 2908 } 2909 2910 2911 /* 2912 * xlate to memory format 2913 * 2914 * ..._tom(name, data) -- macros 2915 * 2916 * Recall that the memory format may be larger than the 2917 * file format (equal versions). Use "backward" copy. 2918 * All these routines require non-null, non-zero arguments. 2919 */ 2920 2921 2922 2923 2924 2925 static void 2926 addr_2L_tom(Elf64_Addr *dst, Byte *src, size_t cnt) 2927 { 2928 Elf64_Addr *end = dst; 2929 2930 dst += cnt; 2931 src += cnt * A_sizeof; 2932 while (dst-- > end) { 2933 src -= A_sizeof; 2934 *dst = (((((((((((Elf64_Addr)(src)[A_L7]<<8) 2935 +(src)[A_L6]<<8) 2936 +(src)[A_L5]<<8) 2937 +(src)[A_L4]<<8) 2938 +(src)[A_L3]<<8) 2939 +(src)[A_L2])<<8) 2940 +(src)[A_L1])<<8) 2941 +(src)[A_L0]); 2942 } 2943 } 2944 2945 static void 2946 addr_2M_tom(Elf64_Addr *dst, Byte *src, size_t cnt) 2947 { 2948 Elf64_Addr *end = dst; 2949 2950 dst += cnt; 2951 src += cnt * A_sizeof; 2952 while (dst-- > end) { 2953 src -= A_sizeof; 2954 *dst = (((((((((((Elf64_Addr)(src)[A_M7]<<8) 2955 +(src)[A_M6]<<8) 2956 +(src)[A_M5]<<8) 2957 +(src)[A_M4]<<8) 2958 +(src)[A_M3]<<8) 2959 +(src)[A_M2])<<8) 2960 +(src)[A_M1])<<8) 2961 +(src)[A_M0]); 2962 } 2963 } 2964 2965 2966 2967 2968 2969 static void 2970 dyn_2L11_tom(Elf64_Dyn *dst, Byte *src, size_t cnt) 2971 { 2972 Elf64_Dyn *end = dst + cnt; 2973 2974 do { 2975 dst->d_tag = (((((((((((Elf64_Xword)(src)[D1_tag_L7]<<8) 2976 +(src)[D1_tag_L6]<<8) 2977 +(src)[D1_tag_L5]<<8) 2978 +(src)[D1_tag_L4]<<8) 2979 +(src)[D1_tag_L3]<<8) 2980 +(src)[D1_tag_L2])<<8) 2981 +(src)[D1_tag_L1])<<8) 2982 +(src)[D1_tag_L0]); 2983 dst->d_un.d_val = (((((((((((Elf64_Xword)(src)[D1_val_L7]<<8) 2984 +(src)[D1_val_L6]<<8) 2985 +(src)[D1_val_L5]<<8) 2986 +(src)[D1_val_L4]<<8) 2987 +(src)[D1_val_L3]<<8) 2988 +(src)[D1_val_L2])<<8) 2989 +(src)[D1_val_L1])<<8) 2990 +(src)[D1_val_L0]); 2991 src += D1_sizeof; 2992 } while (++dst < end); 2993 } 2994 2995 static void 2996 dyn_2M11_tom(Elf64_Dyn *dst, Byte *src, size_t cnt) 2997 { 2998 Elf64_Dyn *end = dst + cnt; 2999 3000 do { 3001 dst->d_tag = (((((((((((Elf64_Xword)(src)[D1_tag_M7]<<8) 3002 +(src)[D1_tag_M6]<<8) 3003 +(src)[D1_tag_M5]<<8) 3004 +(src)[D1_tag_M4]<<8) 3005 +(src)[D1_tag_M3]<<8) 3006 +(src)[D1_tag_M2])<<8) 3007 +(src)[D1_tag_M1])<<8) 3008 +(src)[D1_tag_M0]); 3009 dst->d_un.d_val = (((((((((((Elf64_Xword)(src)[D1_val_M7]<<8) 3010 +(src)[D1_val_M6]<<8) 3011 +(src)[D1_val_M5]<<8) 3012 +(src)[D1_val_M4]<<8) 3013 +(src)[D1_val_M3]<<8) 3014 +(src)[D1_val_M2])<<8) 3015 +(src)[D1_val_M1])<<8) 3016 +(src)[D1_val_M0]); 3017 src += D1_sizeof; 3018 } while (++dst < end); 3019 } 3020 3021 3022 3023 3024 3025 static void 3026 ehdr_2L11_tom(Elf64_Ehdr *dst, Byte *src, size_t cnt) 3027 { 3028 Elf64_Ehdr *end = dst; 3029 3030 dst += cnt; 3031 src += cnt * E1_sizeof; 3032 while (dst-- > end) { 3033 src -= E1_sizeof; 3034 dst->e_shstrndx = (((Elf64_Half)(src)[E1_shstrndx_L1]<<8)+(src)[E1_shstrndx_L0]); 3035 dst->e_shnum = (((Elf64_Half)(src)[E1_shnum_L1]<<8)+(src)[E1_shnum_L0]); 3036 dst->e_shentsize = (((Elf64_Half)(src)[E1_shentsize_L1]<<8)+(src)[E1_shentsize_L0]); 3037 dst->e_phnum = (((Elf64_Half)(src)[E1_phnum_L1]<<8)+(src)[E1_phnum_L0]); 3038 dst->e_phentsize = (((Elf64_Half)(src)[E1_phentsize_L1]<<8)+(src)[E1_phentsize_L0]); 3039 dst->e_ehsize = (((Elf64_Half)(src)[E1_ehsize_L1]<<8)+(src)[E1_ehsize_L0]); 3040 dst->e_flags = (((((((Elf64_Word)(src)[E1_flags_L3]<<8) 3041 +(src)[E1_flags_L2])<<8) 3042 +(src)[E1_flags_L1])<<8) 3043 +(src)[E1_flags_L0]); 3044 dst->e_shoff = (((((((((((Elf64_Off)(src)[E1_shoff_L7]<<8) 3045 +(src)[E1_shoff_L6]<<8) 3046 +(src)[E1_shoff_L5]<<8) 3047 +(src)[E1_shoff_L4]<<8) 3048 +(src)[E1_shoff_L3]<<8) 3049 +(src)[E1_shoff_L2])<<8) 3050 +(src)[E1_shoff_L1])<<8) 3051 +(src)[E1_shoff_L0]); 3052 dst->e_phoff = (((((((((((Elf64_Off)(src)[E1_phoff_L7]<<8) 3053 +(src)[E1_phoff_L6]<<8) 3054 +(src)[E1_phoff_L5]<<8) 3055 +(src)[E1_phoff_L4]<<8) 3056 +(src)[E1_phoff_L3]<<8) 3057 +(src)[E1_phoff_L2])<<8) 3058 +(src)[E1_phoff_L1])<<8) 3059 +(src)[E1_phoff_L0]); 3060 dst->e_entry = (((((((((((Elf64_Addr)(src)[E1_entry_L7]<<8) 3061 +(src)[E1_entry_L6]<<8) 3062 +(src)[E1_entry_L5]<<8) 3063 +(src)[E1_entry_L4]<<8) 3064 +(src)[E1_entry_L3]<<8) 3065 +(src)[E1_entry_L2])<<8) 3066 +(src)[E1_entry_L1])<<8) 3067 +(src)[E1_entry_L0]); 3068 dst->e_version = (((((((Elf64_Word)(src)[E1_version_L3]<<8) 3069 +(src)[E1_version_L2])<<8) 3070 +(src)[E1_version_L1])<<8) 3071 +(src)[E1_version_L0]); 3072 dst->e_machine = (((Elf64_Half)(src)[E1_machine_L1]<<8)+(src)[E1_machine_L0]); 3073 dst->e_type = (((Elf64_Half)(src)[E1_type_L1]<<8)+(src)[E1_type_L0]); 3074 if (dst->e_ident != &src[E1_ident]) 3075 (void) memcpy(dst->e_ident, &src[E1_ident], E1_Nident); 3076 } 3077 } 3078 3079 static void 3080 ehdr_2M11_tom(Elf64_Ehdr *dst, Byte *src, size_t cnt) 3081 { 3082 Elf64_Ehdr *end = dst; 3083 3084 dst += cnt; 3085 src += cnt * E1_sizeof; 3086 while (dst-- > end) { 3087 src -= E1_sizeof; 3088 dst->e_shstrndx = (((Elf64_Half)(src)[E1_shstrndx_M1]<<8)+(src)[E1_shstrndx_M0]); 3089 dst->e_shnum = (((Elf64_Half)(src)[E1_shnum_M1]<<8)+(src)[E1_shnum_M0]); 3090 dst->e_shentsize = (((Elf64_Half)(src)[E1_shentsize_M1]<<8)+(src)[E1_shentsize_M0]); 3091 dst->e_phnum = (((Elf64_Half)(src)[E1_phnum_M1]<<8)+(src)[E1_phnum_M0]); 3092 dst->e_phentsize = (((Elf64_Half)(src)[E1_phentsize_M1]<<8)+(src)[E1_phentsize_M0]); 3093 dst->e_ehsize = (((Elf64_Half)(src)[E1_ehsize_M1]<<8)+(src)[E1_ehsize_M0]); 3094 dst->e_flags = (((((((Elf64_Word)(src)[E1_flags_M3]<<8) 3095 +(src)[E1_flags_M2])<<8) 3096 +(src)[E1_flags_M1])<<8) 3097 +(src)[E1_flags_M0]); 3098 dst->e_shoff = (((((((((((Elf64_Off)(src)[E1_shoff_M7]<<8) 3099 +(src)[E1_shoff_M6]<<8) 3100 +(src)[E1_shoff_M5]<<8) 3101 +(src)[E1_shoff_M4]<<8) 3102 +(src)[E1_shoff_M3]<<8) 3103 +(src)[E1_shoff_M2])<<8) 3104 +(src)[E1_shoff_M1])<<8) 3105 +(src)[E1_shoff_M0]); 3106 dst->e_phoff = (((((((((((Elf64_Off)(src)[E1_phoff_M7]<<8) 3107 +(src)[E1_phoff_M6]<<8) 3108 +(src)[E1_phoff_M5]<<8) 3109 +(src)[E1_phoff_M4]<<8) 3110 +(src)[E1_phoff_M3]<<8) 3111 +(src)[E1_phoff_M2])<<8) 3112 +(src)[E1_phoff_M1])<<8) 3113 +(src)[E1_phoff_M0]); 3114 dst->e_entry = (((((((((((Elf64_Addr)(src)[E1_entry_M7]<<8) 3115 +(src)[E1_entry_M6]<<8) 3116 +(src)[E1_entry_M5]<<8) 3117 +(src)[E1_entry_M4]<<8) 3118 +(src)[E1_entry_M3]<<8) 3119 +(src)[E1_entry_M2])<<8) 3120 +(src)[E1_entry_M1])<<8) 3121 +(src)[E1_entry_M0]); 3122 dst->e_version = (((((((Elf64_Word)(src)[E1_version_M3]<<8) 3123 +(src)[E1_version_M2])<<8) 3124 +(src)[E1_version_M1])<<8) 3125 +(src)[E1_version_M0]); 3126 dst->e_machine = (((Elf64_Half)(src)[E1_machine_M1]<<8)+(src)[E1_machine_M0]); 3127 dst->e_type = (((Elf64_Half)(src)[E1_type_M1]<<8)+(src)[E1_type_M0]); 3128 if (dst->e_ident != &src[E1_ident]) 3129 (void) memcpy(dst->e_ident, &src[E1_ident], E1_Nident); 3130 } 3131 } 3132 3133 3134 3135 3136 3137 static void 3138 half_2L_tom(Elf64_Half *dst, Byte *src, size_t cnt) 3139 { 3140 Elf64_Half *end = dst; 3141 3142 dst += cnt; 3143 src += cnt * H_sizeof; 3144 while (dst-- > end) { 3145 src -= H_sizeof; 3146 *dst = (((Elf64_Half)(src)[H_L1]<<8)+(src)[H_L0]); 3147 } 3148 } 3149 3150 static void 3151 half_2M_tom(Elf64_Half *dst, Byte *src, size_t cnt) 3152 { 3153 Elf64_Half *end = dst; 3154 3155 dst += cnt; 3156 src += cnt * H_sizeof; 3157 while (dst-- > end) { 3158 src -= H_sizeof; 3159 *dst = (((Elf64_Half)(src)[H_M1]<<8)+(src)[H_M0]); 3160 } 3161 } 3162 3163 3164 3165 3166 3167 static void 3168 move_2L11_tom(Elf64_Move *dst, unsigned char *src, size_t cnt) 3169 { 3170 Elf64_Move *end = dst + cnt; 3171 3172 do { 3173 dst->m_value = (((((((((((Elf64_Lword)(src)[M1_value_L7]<<8) 3174 +(src)[M1_value_L6]<<8) 3175 +(src)[M1_value_L5]<<8) 3176 +(src)[M1_value_L4]<<8) 3177 +(src)[M1_value_L3]<<8) 3178 +(src)[M1_value_L2])<<8) 3179 +(src)[M1_value_L1])<<8) 3180 +(src)[M1_value_L0]); 3181 dst->m_info = (((((((Elf64_Word)(src)[M1_info_L3]<<8) 3182 +(src)[M1_info_L2])<<8) 3183 +(src)[M1_info_L1])<<8) 3184 +(src)[M1_info_L0]); 3185 dst->m_poffset = (((((((Elf64_Word)(src)[M1_poffset_L3]<<8) 3186 +(src)[M1_poffset_L2])<<8) 3187 +(src)[M1_poffset_L1])<<8) 3188 +(src)[M1_poffset_L0]); 3189 dst->m_repeat = (((Elf64_Half)(src)[M1_repeat_L1]<<8)+(src)[M1_repeat_L0]); 3190 dst->m_stride = (((Elf64_Half)(src)[M1_stride_L1]<<8)+(src)[M1_stride_L0]); 3191 src += M1_sizeof; 3192 } while (++dst < end); 3193 } 3194 3195 static void 3196 move_2M11_tom(Elf64_Move *dst, unsigned char *src, size_t cnt) 3197 { 3198 Elf64_Move *end = dst + cnt; 3199 3200 do { 3201 dst->m_value = (((((((((((Elf64_Lword)(src)[M1_value_M7]<<8) 3202 +(src)[M1_value_M6]<<8) 3203 +(src)[M1_value_M5]<<8) 3204 +(src)[M1_value_M4]<<8) 3205 +(src)[M1_value_M3]<<8) 3206 +(src)[M1_value_M2])<<8) 3207 +(src)[M1_value_M1])<<8) 3208 +(src)[M1_value_M0]); 3209 dst->m_info = (((((((Elf64_Word)(src)[M1_info_M3]<<8) 3210 +(src)[M1_info_M2])<<8) 3211 +(src)[M1_info_M1])<<8) 3212 +(src)[M1_info_M0]); 3213 dst->m_poffset = (((((((Elf64_Word)(src)[M1_poffset_M3]<<8) 3214 +(src)[M1_poffset_M2])<<8) 3215 +(src)[M1_poffset_M1])<<8) 3216 +(src)[M1_poffset_M0]); 3217 dst->m_repeat = (((Elf64_Half)(src)[M1_repeat_M1]<<8)+(src)[M1_repeat_M0]); 3218 dst->m_stride = (((Elf64_Half)(src)[M1_stride_M1]<<8)+(src)[M1_stride_M0]); 3219 src += M1_sizeof; 3220 } while (++dst < end); 3221 } 3222 3223 3224 3225 3226 3227 static void 3228 movep_2L11_tom(Elf64_Move *dst, unsigned char *src, size_t cnt) 3229 { 3230 Elf64_Move *end = dst + cnt; 3231 3232 do 3233 { 3234 dst->m_value = (((((((((((Elf64_Lword)(src)[MP1_value_L7]<<8) 3235 +(src)[MP1_value_L6]<<8) 3236 +(src)[MP1_value_L5]<<8) 3237 +(src)[MP1_value_L4]<<8) 3238 +(src)[MP1_value_L3]<<8) 3239 +(src)[MP1_value_L2])<<8) 3240 +(src)[MP1_value_L1])<<8) 3241 +(src)[MP1_value_L0]); 3242 dst->m_info = (((((((Elf64_Word)(src)[MP1_info_L3]<<8) 3243 +(src)[MP1_info_L2])<<8) 3244 +(src)[MP1_info_L1])<<8) 3245 +(src)[MP1_info_L0]); 3246 dst->m_poffset = (((((((Elf64_Word)(src)[MP1_poffset_L3]<<8) 3247 +(src)[MP1_poffset_L2])<<8) 3248 +(src)[MP1_poffset_L1])<<8) 3249 +(src)[MP1_poffset_L0]); 3250 dst->m_repeat = (((Elf64_Half)(src)[MP1_repeat_L1]<<8)+(src)[MP1_repeat_L0]); 3251 dst->m_stride = (((Elf64_Half)(src)[MP1_stride_L1]<<8)+(src)[MP1_stride_L0]); 3252 src += MP1_sizeof; 3253 } while (++dst < end); 3254 } 3255 3256 static void 3257 movep_2M11_tom(Elf64_Move *dst, unsigned char *src, size_t cnt) 3258 { 3259 Elf64_Move *end = dst + cnt; 3260 3261 do 3262 { 3263 dst->m_value = (((((((((((Elf64_Lword)(src)[MP1_value_M7]<<8) 3264 +(src)[MP1_value_M6]<<8) 3265 +(src)[MP1_value_M5]<<8) 3266 +(src)[MP1_value_M4]<<8) 3267 +(src)[MP1_value_M3]<<8) 3268 +(src)[MP1_value_M2])<<8) 3269 +(src)[MP1_value_M1])<<8) 3270 +(src)[MP1_value_M0]); 3271 dst->m_info = (((((((Elf64_Word)(src)[MP1_info_M3]<<8) 3272 +(src)[MP1_info_M2])<<8) 3273 +(src)[MP1_info_M1])<<8) 3274 +(src)[MP1_info_M0]); 3275 dst->m_poffset = (((((((Elf64_Word)(src)[MP1_poffset_M3]<<8) 3276 +(src)[MP1_poffset_M2])<<8) 3277 +(src)[MP1_poffset_M1])<<8) 3278 +(src)[MP1_poffset_M0]); 3279 dst->m_repeat = (((Elf64_Half)(src)[MP1_repeat_M1]<<8)+(src)[MP1_repeat_M0]); 3280 dst->m_stride = (((Elf64_Half)(src)[MP1_stride_M1]<<8)+(src)[MP1_stride_M0]); 3281 src += MP1_sizeof; 3282 } while (++dst < end); 3283 } 3284 3285 3286 3287 3288 3289 static void 3290 note_2L11_tom(Elf64_Nhdr *dst, unsigned char *src, size_t cnt) 3291 { 3292 /* LINTED */ 3293 Elf64_Nhdr *end = (Elf64_Nhdr *)((char *)dst + cnt); 3294 3295 /* 3296 * Copy the note data to the destination, translating the 3297 * length fields. Clip against the size of the actual buffer 3298 * to guard against corrupt note data. 3299 */ 3300 while (dst < end) { 3301 Elf64_Nhdr *nhdr; 3302 unsigned char *namestr; 3303 void *desc; 3304 Elf64_Word field_sz; 3305 3306 if ((offsetof(Elf64_Nhdr, n_namesz) + sizeof(Elf64_Word) + 3307 (char *) dst) >= (char *) end) 3308 break; 3309 dst->n_namesz = (((((((Elf64_Word)(src)[N1_namesz_L3]<<8) 3310 +(src)[N1_namesz_L2])<<8) 3311 +(src)[N1_namesz_L1])<<8) 3312 +(src)[N1_namesz_L0]); 3313 3314 if ((offsetof(Elf64_Nhdr, n_descsz) + sizeof(Elf64_Word) + 3315 (char *) dst) >= (char *) end) 3316 break; 3317 dst->n_descsz = (((((((Elf64_Word)(src)[N1_descsz_L3]<<8) 3318 +(src)[N1_descsz_L2])<<8) 3319 +(src)[N1_descsz_L1])<<8) 3320 +(src)[N1_descsz_L0]); 3321 3322 if ((offsetof(Elf64_Nhdr, n_type) + sizeof(Elf64_Word) + 3323 (char *) dst) >= (char *) end) 3324 break; 3325 dst->n_type = (((((((Elf64_Word)(src)[N1_type_L3]<<8) 3326 +(src)[N1_type_L2])<<8) 3327 +(src)[N1_type_L1])<<8) 3328 +(src)[N1_type_L0]); 3329 nhdr = dst; 3330 3331 /* LINTED */ 3332 dst = (Elf64_Nhdr *)((char *)dst + sizeof (Elf64_Nhdr)); 3333 namestr = src + N1_sizeof; 3334 field_sz = S_ROUND(nhdr->n_namesz, sizeof (Elf64_Word)); 3335 if ((field_sz + (char *) dst) > (char *) end) { 3336 field_sz = (char *) end - (char *) dst; 3337 if (field_sz == 0) 3338 break; 3339 } 3340 (void)memcpy((void *)dst, namestr, field_sz); 3341 desc = namestr + field_sz; 3342 3343 /* LINTED */ 3344 dst = (Elf64_Nhdr *)((char *)dst + field_sz); 3345 field_sz = nhdr->n_descsz; 3346 if ((field_sz + (char *) dst) > (char *) end) { 3347 field_sz = (char *) end - (char *) dst; 3348 if (field_sz == 0) 3349 break; 3350 } 3351 (void)memcpy(dst, desc, field_sz); 3352 field_sz = S_ROUND(field_sz, sizeof (Elf64_Word)); 3353 3354 /* LINTED */ 3355 dst = (Elf64_Nhdr *)((char *)dst + field_sz); 3356 src = (unsigned char *)desc + field_sz; 3357 } 3358 } 3359 3360 static void 3361 note_2M11_tom(Elf64_Nhdr *dst, unsigned char *src, size_t cnt) 3362 { 3363 /* LINTED */ 3364 Elf64_Nhdr *end = (Elf64_Nhdr *)((char *)dst + cnt); 3365 3366 /* 3367 * Copy the note data to the destination, translating the 3368 * length fields. Clip against the size of the actual buffer 3369 * to guard against corrupt note data. 3370 */ 3371 while (dst < end) { 3372 Elf64_Nhdr *nhdr; 3373 unsigned char *namestr; 3374 void *desc; 3375 Elf64_Word field_sz; 3376 3377 if ((offsetof(Elf64_Nhdr, n_namesz) + sizeof(Elf64_Word) + 3378 (char *) dst) >= (char *) end) 3379 break; 3380 dst->n_namesz = (((((((Elf64_Word)(src)[N1_namesz_M3]<<8) 3381 +(src)[N1_namesz_M2])<<8) 3382 +(src)[N1_namesz_M1])<<8) 3383 +(src)[N1_namesz_M0]); 3384 3385 if ((offsetof(Elf64_Nhdr, n_descsz) + sizeof(Elf64_Word) + 3386 (char *) dst) >= (char *) end) 3387 break; 3388 dst->n_descsz = (((((((Elf64_Word)(src)[N1_descsz_M3]<<8) 3389 +(src)[N1_descsz_M2])<<8) 3390 +(src)[N1_descsz_M1])<<8) 3391 +(src)[N1_descsz_M0]); 3392 3393 if ((offsetof(Elf64_Nhdr, n_type) + sizeof(Elf64_Word) + 3394 (char *) dst) >= (char *) end) 3395 break; 3396 dst->n_type = (((((((Elf64_Word)(src)[N1_type_M3]<<8) 3397 +(src)[N1_type_M2])<<8) 3398 +(src)[N1_type_M1])<<8) 3399 +(src)[N1_type_M0]); 3400 nhdr = dst; 3401 3402 /* LINTED */ 3403 dst = (Elf64_Nhdr *)((char *)dst + sizeof (Elf64_Nhdr)); 3404 namestr = src + N1_sizeof; 3405 field_sz = S_ROUND(nhdr->n_namesz, sizeof (Elf64_Word)); 3406 if ((field_sz + (char *) dst) > (char *) end) { 3407 field_sz = (char *) end - (char *) dst; 3408 if (field_sz == 0) 3409 break; 3410 } 3411 (void)memcpy((void *)dst, namestr, field_sz); 3412 desc = namestr + field_sz; 3413 3414 /* LINTED */ 3415 dst = (Elf64_Nhdr *)((char *)dst + field_sz); 3416 field_sz = nhdr->n_descsz; 3417 if ((field_sz + (char *) dst) > (char *) end) { 3418 field_sz = (char *) end - (char *) dst; 3419 if (field_sz == 0) 3420 break; 3421 } 3422 (void)memcpy(dst, desc, field_sz); 3423 field_sz = S_ROUND(field_sz, sizeof (Elf64_Word)); 3424 3425 /* LINTED */ 3426 dst = (Elf64_Nhdr *)((char *)dst + field_sz); 3427 src = (unsigned char *)desc + field_sz; 3428 } 3429 } 3430 3431 3432 3433 3434 static void 3435 off_2L_tom(Elf64_Off *dst, Byte *src, size_t cnt) 3436 { 3437 Elf64_Off *end = dst; 3438 3439 dst += cnt; 3440 src += cnt * O_sizeof; 3441 while (dst-- > end) { 3442 src -= O_sizeof; 3443 *dst = (((((((((((Elf64_Off)(src)[O_L7]<<8) 3444 +(src)[O_L6]<<8) 3445 +(src)[O_L5]<<8) 3446 +(src)[O_L4]<<8) 3447 +(src)[O_L3]<<8) 3448 +(src)[O_L2])<<8) 3449 +(src)[O_L1])<<8) 3450 +(src)[O_L0]); 3451 } 3452 } 3453 3454 static void 3455 off_2M_tom(Elf64_Off *dst, Byte *src, size_t cnt) 3456 { 3457 Elf64_Off *end = dst; 3458 3459 dst += cnt; 3460 src += cnt * O_sizeof; 3461 while (dst-- > end) { 3462 src -= O_sizeof; 3463 *dst = (((((((((((Elf64_Off)(src)[O_M7]<<8) 3464 +(src)[O_M6]<<8) 3465 +(src)[O_M5]<<8) 3466 +(src)[O_M4]<<8) 3467 +(src)[O_M3]<<8) 3468 +(src)[O_M2])<<8) 3469 +(src)[O_M1])<<8) 3470 +(src)[O_M0]); 3471 } 3472 } 3473 3474 3475 3476 3477 3478 static void 3479 phdr_2L11_tom(Elf64_Phdr *dst, Byte *src, size_t cnt) 3480 { 3481 Elf64_Phdr *end = dst; 3482 3483 dst += cnt; 3484 src += cnt * P1_sizeof; 3485 while (dst-- > end) { 3486 src -= P1_sizeof; 3487 dst->p_align = (((((((((((Elf64_Xword)(src)[P1_align_L7]<<8) 3488 +(src)[P1_align_L6]<<8) 3489 +(src)[P1_align_L5]<<8) 3490 +(src)[P1_align_L4]<<8) 3491 +(src)[P1_align_L3]<<8) 3492 +(src)[P1_align_L2])<<8) 3493 +(src)[P1_align_L1])<<8) 3494 +(src)[P1_align_L0]); 3495 dst->p_memsz = (((((((((((Elf64_Xword)(src)[P1_memsz_L7]<<8) 3496 +(src)[P1_memsz_L6]<<8) 3497 +(src)[P1_memsz_L5]<<8) 3498 +(src)[P1_memsz_L4]<<8) 3499 +(src)[P1_memsz_L3]<<8) 3500 +(src)[P1_memsz_L2])<<8) 3501 +(src)[P1_memsz_L1])<<8) 3502 +(src)[P1_memsz_L0]); 3503 dst->p_filesz = (((((((((((Elf64_Xword)(src)[P1_filesz_L7]<<8) 3504 +(src)[P1_filesz_L6]<<8) 3505 +(src)[P1_filesz_L5]<<8) 3506 +(src)[P1_filesz_L4]<<8) 3507 +(src)[P1_filesz_L3]<<8) 3508 +(src)[P1_filesz_L2])<<8) 3509 +(src)[P1_filesz_L1])<<8) 3510 +(src)[P1_filesz_L0]); 3511 dst->p_paddr = (((((((((((Elf64_Addr)(src)[P1_paddr_L7]<<8) 3512 +(src)[P1_paddr_L6]<<8) 3513 +(src)[P1_paddr_L5]<<8) 3514 +(src)[P1_paddr_L4]<<8) 3515 +(src)[P1_paddr_L3]<<8) 3516 +(src)[P1_paddr_L2])<<8) 3517 +(src)[P1_paddr_L1])<<8) 3518 +(src)[P1_paddr_L0]); 3519 dst->p_vaddr = (((((((((((Elf64_Addr)(src)[P1_vaddr_L7]<<8) 3520 +(src)[P1_vaddr_L6]<<8) 3521 +(src)[P1_vaddr_L5]<<8) 3522 +(src)[P1_vaddr_L4]<<8) 3523 +(src)[P1_vaddr_L3]<<8) 3524 +(src)[P1_vaddr_L2])<<8) 3525 +(src)[P1_vaddr_L1])<<8) 3526 +(src)[P1_vaddr_L0]); 3527 dst->p_offset = (((((((((((Elf64_Off)(src)[P1_offset_L7]<<8) 3528 +(src)[P1_offset_L6]<<8) 3529 +(src)[P1_offset_L5]<<8) 3530 +(src)[P1_offset_L4]<<8) 3531 +(src)[P1_offset_L3]<<8) 3532 +(src)[P1_offset_L2])<<8) 3533 +(src)[P1_offset_L1])<<8) 3534 +(src)[P1_offset_L0]); 3535 dst->p_flags = (((((((Elf64_Word)(src)[P1_flags_L3]<<8) 3536 +(src)[P1_flags_L2])<<8) 3537 +(src)[P1_flags_L1])<<8) 3538 +(src)[P1_flags_L0]); 3539 dst->p_type = (((((((Elf64_Word)(src)[P1_type_L3]<<8) 3540 +(src)[P1_type_L2])<<8) 3541 +(src)[P1_type_L1])<<8) 3542 +(src)[P1_type_L0]); 3543 } 3544 } 3545 3546 static void 3547 phdr_2M11_tom(Elf64_Phdr *dst, Byte *src, size_t cnt) 3548 { 3549 Elf64_Phdr *end = dst; 3550 3551 dst += cnt; 3552 src += cnt * P1_sizeof; 3553 while (dst-- > end) { 3554 src -= P1_sizeof; 3555 dst->p_align = (((((((((((Elf64_Xword)(src)[P1_align_M7]<<8) 3556 +(src)[P1_align_M6]<<8) 3557 +(src)[P1_align_M5]<<8) 3558 +(src)[P1_align_M4]<<8) 3559 +(src)[P1_align_M3]<<8) 3560 +(src)[P1_align_M2])<<8) 3561 +(src)[P1_align_M1])<<8) 3562 +(src)[P1_align_M0]); 3563 dst->p_memsz = (((((((((((Elf64_Xword)(src)[P1_memsz_M7]<<8) 3564 +(src)[P1_memsz_M6]<<8) 3565 +(src)[P1_memsz_M5]<<8) 3566 +(src)[P1_memsz_M4]<<8) 3567 +(src)[P1_memsz_M3]<<8) 3568 +(src)[P1_memsz_M2])<<8) 3569 +(src)[P1_memsz_M1])<<8) 3570 +(src)[P1_memsz_M0]); 3571 dst->p_filesz = (((((((((((Elf64_Xword)(src)[P1_filesz_M7]<<8) 3572 +(src)[P1_filesz_M6]<<8) 3573 +(src)[P1_filesz_M5]<<8) 3574 +(src)[P1_filesz_M4]<<8) 3575 +(src)[P1_filesz_M3]<<8) 3576 +(src)[P1_filesz_M2])<<8) 3577 +(src)[P1_filesz_M1])<<8) 3578 +(src)[P1_filesz_M0]); 3579 dst->p_paddr = (((((((((((Elf64_Addr)(src)[P1_paddr_M7]<<8) 3580 +(src)[P1_paddr_M6]<<8) 3581 +(src)[P1_paddr_M5]<<8) 3582 +(src)[P1_paddr_M4]<<8) 3583 +(src)[P1_paddr_M3]<<8) 3584 +(src)[P1_paddr_M2])<<8) 3585 +(src)[P1_paddr_M1])<<8) 3586 +(src)[P1_paddr_M0]); 3587 dst->p_vaddr = (((((((((((Elf64_Addr)(src)[P1_vaddr_M7]<<8) 3588 +(src)[P1_vaddr_M6]<<8) 3589 +(src)[P1_vaddr_M5]<<8) 3590 +(src)[P1_vaddr_M4]<<8) 3591 +(src)[P1_vaddr_M3]<<8) 3592 +(src)[P1_vaddr_M2])<<8) 3593 +(src)[P1_vaddr_M1])<<8) 3594 +(src)[P1_vaddr_M0]); 3595 dst->p_offset = (((((((((((Elf64_Off)(src)[P1_offset_M7]<<8) 3596 +(src)[P1_offset_M6]<<8) 3597 +(src)[P1_offset_M5]<<8) 3598 +(src)[P1_offset_M4]<<8) 3599 +(src)[P1_offset_M3]<<8) 3600 +(src)[P1_offset_M2])<<8) 3601 +(src)[P1_offset_M1])<<8) 3602 +(src)[P1_offset_M0]); 3603 dst->p_flags = (((((((Elf64_Word)(src)[P1_flags_M3]<<8) 3604 +(src)[P1_flags_M2])<<8) 3605 +(src)[P1_flags_M1])<<8) 3606 +(src)[P1_flags_M0]); 3607 dst->p_type = (((((((Elf64_Word)(src)[P1_type_M3]<<8) 3608 +(src)[P1_type_M2])<<8) 3609 +(src)[P1_type_M1])<<8) 3610 +(src)[P1_type_M0]); 3611 } 3612 } 3613 3614 3615 3616 3617 3618 static void 3619 rel_2L11_tom(Elf64_Rel *dst, Byte *src, size_t cnt) 3620 { 3621 Elf64_Rel *end = dst; 3622 3623 dst += cnt; 3624 src += cnt * R1_sizeof; 3625 while (dst-- > end) { 3626 src -= R1_sizeof; 3627 dst->r_info = (((((((((((Elf64_Xword)(src)[R1_info_L7]<<8) 3628 +(src)[R1_info_L6]<<8) 3629 +(src)[R1_info_L5]<<8) 3630 +(src)[R1_info_L4]<<8) 3631 +(src)[R1_info_L3]<<8) 3632 +(src)[R1_info_L2])<<8) 3633 +(src)[R1_info_L1])<<8) 3634 +(src)[R1_info_L0]); 3635 dst->r_offset = (((((((((((Elf64_Addr)(src)[R1_offset_L7]<<8) 3636 +(src)[R1_offset_L6]<<8) 3637 +(src)[R1_offset_L5]<<8) 3638 +(src)[R1_offset_L4]<<8) 3639 +(src)[R1_offset_L3]<<8) 3640 +(src)[R1_offset_L2])<<8) 3641 +(src)[R1_offset_L1])<<8) 3642 +(src)[R1_offset_L0]); 3643 } 3644 } 3645 3646 static void 3647 rel_2M11_tom(Elf64_Rel *dst, Byte *src, size_t cnt) 3648 { 3649 Elf64_Rel *end = dst; 3650 3651 dst += cnt; 3652 src += cnt * R1_sizeof; 3653 while (dst-- > end) { 3654 src -= R1_sizeof; 3655 dst->r_info = (((((((((((Elf64_Xword)(src)[R1_info_M7]<<8) 3656 +(src)[R1_info_M6]<<8) 3657 +(src)[R1_info_M5]<<8) 3658 +(src)[R1_info_M4]<<8) 3659 +(src)[R1_info_M3]<<8) 3660 +(src)[R1_info_M2])<<8) 3661 +(src)[R1_info_M1])<<8) 3662 +(src)[R1_info_M0]); 3663 dst->r_offset = (((((((((((Elf64_Addr)(src)[R1_offset_M7]<<8) 3664 +(src)[R1_offset_M6]<<8) 3665 +(src)[R1_offset_M5]<<8) 3666 +(src)[R1_offset_M4]<<8) 3667 +(src)[R1_offset_M3]<<8) 3668 +(src)[R1_offset_M2])<<8) 3669 +(src)[R1_offset_M1])<<8) 3670 +(src)[R1_offset_M0]); 3671 } 3672 } 3673 3674 3675 3676 3677 3678 static void 3679 rela_2L11_tom(Elf64_Rela *dst, Byte *src, size_t cnt) 3680 { 3681 Elf64_Rela *end = dst; 3682 3683 dst += cnt; 3684 src += cnt * RA1_sizeof; 3685 while (dst-- > end) { 3686 src -= RA1_sizeof; 3687 /*CONSTANTCONDITION*/ 3688 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1 && /* 2s comp */ 3689 ~(~(Elf64_Xword)0 >> 1) == HI64) { 3690 dst->r_addend = (((((((((((Elf64_Xword)(src)[RA1_addend_L7]<<8) 3691 +(src)[RA1_addend_L6]<<8) 3692 +(src)[RA1_addend_L5]<<8) 3693 +(src)[RA1_addend_L4]<<8) 3694 +(src)[RA1_addend_L3]<<8) 3695 +(src)[RA1_addend_L2])<<8) 3696 +(src)[RA1_addend_L1])<<8) 3697 +(src)[RA1_addend_L0]); 3698 } else { 3699 union { 3700 Elf64_Xword w; 3701 Elf64_Sxword sw; 3702 } u; 3703 3704 if ((u.w = (((((((((((Elf64_Xword)(src)[RA1_addend_L7]<<8) 3705 +(src)[RA1_addend_L6]<<8) 3706 +(src)[RA1_addend_L5]<<8) 3707 +(src)[RA1_addend_L4]<<8) 3708 +(src)[RA1_addend_L3]<<8) 3709 +(src)[RA1_addend_L2])<<8) 3710 +(src)[RA1_addend_L1])<<8) 3711 +(src)[RA1_addend_L0])) & HI64) { 3712 /* LINTED */ 3713 u.w |= ~(Elf64_Xword)LO63; 3714 u.w = ~u.w + 1; 3715 u.sw = -u.w; 3716 } 3717 dst->r_addend = u.sw; 3718 } 3719 dst->r_info = (((((((((((Elf64_Xword)(src)[RA1_info_L7]<<8) 3720 +(src)[RA1_info_L6]<<8) 3721 +(src)[RA1_info_L5]<<8) 3722 +(src)[RA1_info_L4]<<8) 3723 +(src)[RA1_info_L3]<<8) 3724 +(src)[RA1_info_L2])<<8) 3725 +(src)[RA1_info_L1])<<8) 3726 +(src)[RA1_info_L0]); 3727 dst->r_offset = (((((((((((Elf64_Addr)(src)[RA1_offset_L7]<<8) 3728 +(src)[RA1_offset_L6]<<8) 3729 +(src)[RA1_offset_L5]<<8) 3730 +(src)[RA1_offset_L4]<<8) 3731 +(src)[RA1_offset_L3]<<8) 3732 +(src)[RA1_offset_L2])<<8) 3733 +(src)[RA1_offset_L1])<<8) 3734 +(src)[RA1_offset_L0]); 3735 } 3736 } 3737 3738 static void 3739 rela_2M11_tom(Elf64_Rela *dst, Byte *src, size_t cnt) 3740 { 3741 Elf64_Rela *end = dst; 3742 3743 dst += cnt; 3744 src += cnt * RA1_sizeof; 3745 while (dst-- > end) { 3746 src -= RA1_sizeof; 3747 /*CONSTANTCONDITION*/ 3748 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1 && /* 2s comp */ 3749 ~(~(Elf64_Xword)0 >> 1) == HI64) { 3750 dst->r_addend = (((((((((((Elf64_Xword)(src)[RA1_addend_M7]<<8) 3751 +(src)[RA1_addend_M6]<<8) 3752 +(src)[RA1_addend_M5]<<8) 3753 +(src)[RA1_addend_M4]<<8) 3754 +(src)[RA1_addend_M3]<<8) 3755 +(src)[RA1_addend_M2])<<8) 3756 +(src)[RA1_addend_M1])<<8) 3757 +(src)[RA1_addend_M0]); 3758 } else { 3759 union { 3760 Elf64_Xword w; 3761 Elf64_Sxword sw; 3762 } u; 3763 3764 if ((u.w = (((((((((((Elf64_Xword)(src)[RA1_addend_M7]<<8) 3765 +(src)[RA1_addend_M6]<<8) 3766 +(src)[RA1_addend_M5]<<8) 3767 +(src)[RA1_addend_M4]<<8) 3768 +(src)[RA1_addend_M3]<<8) 3769 +(src)[RA1_addend_M2])<<8) 3770 +(src)[RA1_addend_M1])<<8) 3771 +(src)[RA1_addend_M0])) & HI64) { 3772 /* LINTED */ 3773 u.w |= ~(Elf64_Xword)LO63; 3774 u.w = ~u.w + 1; 3775 u.sw = -u.w; 3776 } 3777 dst->r_addend = u.sw; 3778 } 3779 dst->r_info = (((((((((((Elf64_Xword)(src)[RA1_info_M7]<<8) 3780 +(src)[RA1_info_M6]<<8) 3781 +(src)[RA1_info_M5]<<8) 3782 +(src)[RA1_info_M4]<<8) 3783 +(src)[RA1_info_M3]<<8) 3784 +(src)[RA1_info_M2])<<8) 3785 +(src)[RA1_info_M1])<<8) 3786 +(src)[RA1_info_M0]); 3787 dst->r_offset = (((((((((((Elf64_Addr)(src)[RA1_offset_M7]<<8) 3788 +(src)[RA1_offset_M6]<<8) 3789 +(src)[RA1_offset_M5]<<8) 3790 +(src)[RA1_offset_M4]<<8) 3791 +(src)[RA1_offset_M3]<<8) 3792 +(src)[RA1_offset_M2])<<8) 3793 +(src)[RA1_offset_M1])<<8) 3794 +(src)[RA1_offset_M0]); 3795 } 3796 } 3797 3798 3799 3800 3801 3802 static void 3803 shdr_2L11_tom(Elf64_Shdr *dst, Byte *src, size_t cnt) 3804 { 3805 Elf64_Shdr *end = dst; 3806 3807 dst += cnt; 3808 src += cnt * SH1_sizeof; 3809 while (dst-- > end) { 3810 src -= SH1_sizeof; 3811 dst->sh_entsize = (((((((((((Elf64_Xword)(src)[SH1_entsize_L7]<<8) 3812 +(src)[SH1_entsize_L6]<<8) 3813 +(src)[SH1_entsize_L5]<<8) 3814 +(src)[SH1_entsize_L4]<<8) 3815 +(src)[SH1_entsize_L3]<<8) 3816 +(src)[SH1_entsize_L2])<<8) 3817 +(src)[SH1_entsize_L1])<<8) 3818 +(src)[SH1_entsize_L0]); 3819 dst->sh_addralign = (((((((((((Elf64_Xword)(src)[SH1_addralign_L7]<<8) 3820 +(src)[SH1_addralign_L6]<<8) 3821 +(src)[SH1_addralign_L5]<<8) 3822 +(src)[SH1_addralign_L4]<<8) 3823 +(src)[SH1_addralign_L3]<<8) 3824 +(src)[SH1_addralign_L2])<<8) 3825 +(src)[SH1_addralign_L1])<<8) 3826 +(src)[SH1_addralign_L0]); 3827 dst->sh_info = (((((((Elf64_Word)(src)[SH1_info_L3]<<8) 3828 +(src)[SH1_info_L2])<<8) 3829 +(src)[SH1_info_L1])<<8) 3830 +(src)[SH1_info_L0]); 3831 dst->sh_link = (((((((Elf64_Word)(src)[SH1_link_L3]<<8) 3832 +(src)[SH1_link_L2])<<8) 3833 +(src)[SH1_link_L1])<<8) 3834 +(src)[SH1_link_L0]); 3835 dst->sh_size = (((((((((((Elf64_Xword)(src)[SH1_size_L7]<<8) 3836 +(src)[SH1_size_L6]<<8) 3837 +(src)[SH1_size_L5]<<8) 3838 +(src)[SH1_size_L4]<<8) 3839 +(src)[SH1_size_L3]<<8) 3840 +(src)[SH1_size_L2])<<8) 3841 +(src)[SH1_size_L1])<<8) 3842 +(src)[SH1_size_L0]); 3843 dst->sh_offset = (((((((((((Elf64_Off)(src)[SH1_offset_L7]<<8) 3844 +(src)[SH1_offset_L6]<<8) 3845 +(src)[SH1_offset_L5]<<8) 3846 +(src)[SH1_offset_L4]<<8) 3847 +(src)[SH1_offset_L3]<<8) 3848 +(src)[SH1_offset_L2])<<8) 3849 +(src)[SH1_offset_L1])<<8) 3850 +(src)[SH1_offset_L0]); 3851 dst->sh_addr = (((((((((((Elf64_Addr)(src)[SH1_addr_L7]<<8) 3852 +(src)[SH1_addr_L6]<<8) 3853 +(src)[SH1_addr_L5]<<8) 3854 +(src)[SH1_addr_L4]<<8) 3855 +(src)[SH1_addr_L3]<<8) 3856 +(src)[SH1_addr_L2])<<8) 3857 +(src)[SH1_addr_L1])<<8) 3858 +(src)[SH1_addr_L0]); 3859 dst->sh_flags = (((((((((((Elf64_Xword)(src)[SH1_flags_L7]<<8) 3860 +(src)[SH1_flags_L6]<<8) 3861 +(src)[SH1_flags_L5]<<8) 3862 +(src)[SH1_flags_L4]<<8) 3863 +(src)[SH1_flags_L3]<<8) 3864 +(src)[SH1_flags_L2])<<8) 3865 +(src)[SH1_flags_L1])<<8) 3866 +(src)[SH1_flags_L0]); 3867 dst->sh_type = (((((((Elf64_Word)(src)[SH1_type_L3]<<8) 3868 +(src)[SH1_type_L2])<<8) 3869 +(src)[SH1_type_L1])<<8) 3870 +(src)[SH1_type_L0]); 3871 dst->sh_name = (((((((Elf64_Word)(src)[SH1_name_L3]<<8) 3872 +(src)[SH1_name_L2])<<8) 3873 +(src)[SH1_name_L1])<<8) 3874 +(src)[SH1_name_L0]); 3875 } 3876 } 3877 3878 static void 3879 shdr_2M11_tom(Elf64_Shdr *dst, Byte *src, size_t cnt) 3880 { 3881 Elf64_Shdr *end = dst; 3882 3883 dst += cnt; 3884 src += cnt * SH1_sizeof; 3885 while (dst-- > end) { 3886 src -= SH1_sizeof; 3887 dst->sh_entsize = (((((((((((Elf64_Xword)(src)[SH1_entsize_M7]<<8) 3888 +(src)[SH1_entsize_M6]<<8) 3889 +(src)[SH1_entsize_M5]<<8) 3890 +(src)[SH1_entsize_M4]<<8) 3891 +(src)[SH1_entsize_M3]<<8) 3892 +(src)[SH1_entsize_M2])<<8) 3893 +(src)[SH1_entsize_M1])<<8) 3894 +(src)[SH1_entsize_M0]); 3895 dst->sh_addralign = (((((((((((Elf64_Xword)(src)[SH1_addralign_M7]<<8) 3896 +(src)[SH1_addralign_M6]<<8) 3897 +(src)[SH1_addralign_M5]<<8) 3898 +(src)[SH1_addralign_M4]<<8) 3899 +(src)[SH1_addralign_M3]<<8) 3900 +(src)[SH1_addralign_M2])<<8) 3901 +(src)[SH1_addralign_M1])<<8) 3902 +(src)[SH1_addralign_M0]); 3903 dst->sh_info = (((((((Elf64_Word)(src)[SH1_info_M3]<<8) 3904 +(src)[SH1_info_M2])<<8) 3905 +(src)[SH1_info_M1])<<8) 3906 +(src)[SH1_info_M0]); 3907 dst->sh_link = (((((((Elf64_Word)(src)[SH1_link_M3]<<8) 3908 +(src)[SH1_link_M2])<<8) 3909 +(src)[SH1_link_M1])<<8) 3910 +(src)[SH1_link_M0]); 3911 dst->sh_size = (((((((((((Elf64_Xword)(src)[SH1_size_M7]<<8) 3912 +(src)[SH1_size_M6]<<8) 3913 +(src)[SH1_size_M5]<<8) 3914 +(src)[SH1_size_M4]<<8) 3915 +(src)[SH1_size_M3]<<8) 3916 +(src)[SH1_size_M2])<<8) 3917 +(src)[SH1_size_M1])<<8) 3918 +(src)[SH1_size_M0]); 3919 dst->sh_offset = (((((((((((Elf64_Off)(src)[SH1_offset_M7]<<8) 3920 +(src)[SH1_offset_M6]<<8) 3921 +(src)[SH1_offset_M5]<<8) 3922 +(src)[SH1_offset_M4]<<8) 3923 +(src)[SH1_offset_M3]<<8) 3924 +(src)[SH1_offset_M2])<<8) 3925 +(src)[SH1_offset_M1])<<8) 3926 +(src)[SH1_offset_M0]); 3927 dst->sh_addr = (((((((((((Elf64_Addr)(src)[SH1_addr_M7]<<8) 3928 +(src)[SH1_addr_M6]<<8) 3929 +(src)[SH1_addr_M5]<<8) 3930 +(src)[SH1_addr_M4]<<8) 3931 +(src)[SH1_addr_M3]<<8) 3932 +(src)[SH1_addr_M2])<<8) 3933 +(src)[SH1_addr_M1])<<8) 3934 +(src)[SH1_addr_M0]); 3935 dst->sh_flags = (((((((((((Elf64_Xword)(src)[SH1_flags_M7]<<8) 3936 +(src)[SH1_flags_M6]<<8) 3937 +(src)[SH1_flags_M5]<<8) 3938 +(src)[SH1_flags_M4]<<8) 3939 +(src)[SH1_flags_M3]<<8) 3940 +(src)[SH1_flags_M2])<<8) 3941 +(src)[SH1_flags_M1])<<8) 3942 +(src)[SH1_flags_M0]); 3943 dst->sh_type = (((((((Elf64_Word)(src)[SH1_type_M3]<<8) 3944 +(src)[SH1_type_M2])<<8) 3945 +(src)[SH1_type_M1])<<8) 3946 +(src)[SH1_type_M0]); 3947 dst->sh_name = (((((((Elf64_Word)(src)[SH1_name_M3]<<8) 3948 +(src)[SH1_name_M2])<<8) 3949 +(src)[SH1_name_M1])<<8) 3950 +(src)[SH1_name_M0]); 3951 } 3952 } 3953 3954 3955 3956 3957 3958 static void 3959 sword_2L_tom(Elf64_Sword *dst, Byte *src, size_t cnt) 3960 { 3961 Elf64_Sword *end = dst; 3962 3963 dst += cnt; 3964 src += cnt * W_sizeof; 3965 while (dst-- > end) { 3966 src -= W_sizeof; 3967 /*CONSTANTCONDITION*/ 3968 if (~(Elf64_Word)0 == -(Elf64_Sword)1 && 3969 ~(~(Elf64_Word)0 >> 1) == HI32) { /* 2s comp */ 3970 *dst = (((((((Elf64_Word)(src)[W_L3]<<8) 3971 +(src)[W_L2])<<8) 3972 +(src)[W_L1])<<8) 3973 +(src)[W_L0]); 3974 } else { 3975 union { 3976 Elf64_Word w; 3977 Elf64_Sword sw; 3978 } u; 3979 3980 if ((u.w = (((((((Elf64_Word)(src)[W_L3]<<8) 3981 +(src)[W_L2])<<8) 3982 +(src)[W_L1])<<8) 3983 +(src)[W_L0])) & HI32) { 3984 u.w |= ~(Elf64_Word)LO31; 3985 u.w = ~u.w + 1; 3986 u.sw = -u.w; 3987 } 3988 *dst = u.sw; 3989 } 3990 } 3991 } 3992 3993 static void 3994 sword_2M_tom(Elf64_Sword *dst, Byte *src, size_t cnt) 3995 { 3996 Elf64_Sword *end = dst; 3997 3998 dst += cnt; 3999 src += cnt * W_sizeof; 4000 while (dst-- > end) { 4001 src -= W_sizeof; 4002 /*CONSTANTCONDITION*/ 4003 if (~(Elf64_Word)0 == -(Elf64_Sword)1 && 4004 ~(~(Elf64_Word)0 >> 1) == HI32) { /* 2s comp */ 4005 *dst = (((((((Elf64_Word)(src)[W_M3]<<8) 4006 +(src)[W_M2])<<8) 4007 +(src)[W_M1])<<8) 4008 +(src)[W_M0]); 4009 } else { 4010 union { 4011 Elf64_Word w; 4012 Elf64_Sword sw; 4013 } u; 4014 4015 if ((u.w = (((((((Elf64_Word)(src)[W_M3]<<8) 4016 +(src)[W_M2])<<8) 4017 +(src)[W_M1])<<8) 4018 +(src)[W_M0])) & HI32) { 4019 u.w |= ~(Elf64_Word)LO31; 4020 u.w = ~u.w + 1; 4021 u.sw = -u.w; 4022 } 4023 *dst = u.sw; 4024 } 4025 } 4026 } 4027 4028 4029 4030 4031 4032 static void 4033 cap_2L11_tom(Elf64_Cap *dst, unsigned char *src, size_t cnt) 4034 { 4035 Elf64_Cap *end = dst + cnt; 4036 4037 do { 4038 dst->c_tag = (((((((((((Elf64_Xword)(src)[C1_tag_L7]<<8) 4039 +(src)[C1_tag_L6]<<8) 4040 +(src)[C1_tag_L5]<<8) 4041 +(src)[C1_tag_L4]<<8) 4042 +(src)[C1_tag_L3]<<8) 4043 +(src)[C1_tag_L2])<<8) 4044 +(src)[C1_tag_L1])<<8) 4045 +(src)[C1_tag_L0]); 4046 dst->c_un.c_val = (((((((((((Elf64_Xword)(src)[C1_val_L7]<<8) 4047 +(src)[C1_val_L6]<<8) 4048 +(src)[C1_val_L5]<<8) 4049 +(src)[C1_val_L4]<<8) 4050 +(src)[C1_val_L3]<<8) 4051 +(src)[C1_val_L2])<<8) 4052 +(src)[C1_val_L1])<<8) 4053 +(src)[C1_val_L0]); 4054 src += C1_sizeof; 4055 } while (++dst < end); 4056 } 4057 4058 static void 4059 cap_2M11_tom(Elf64_Cap *dst, unsigned char *src, size_t cnt) 4060 { 4061 Elf64_Cap *end = dst + cnt; 4062 4063 do { 4064 dst->c_tag = (((((((((((Elf64_Xword)(src)[C1_tag_M7]<<8) 4065 +(src)[C1_tag_M6]<<8) 4066 +(src)[C1_tag_M5]<<8) 4067 +(src)[C1_tag_M4]<<8) 4068 +(src)[C1_tag_M3]<<8) 4069 +(src)[C1_tag_M2])<<8) 4070 +(src)[C1_tag_M1])<<8) 4071 +(src)[C1_tag_M0]); 4072 dst->c_un.c_val = (((((((((((Elf64_Xword)(src)[C1_val_M7]<<8) 4073 +(src)[C1_val_M6]<<8) 4074 +(src)[C1_val_M5]<<8) 4075 +(src)[C1_val_M4]<<8) 4076 +(src)[C1_val_M3]<<8) 4077 +(src)[C1_val_M2])<<8) 4078 +(src)[C1_val_M1])<<8) 4079 +(src)[C1_val_M0]); 4080 src += C1_sizeof; 4081 } while (++dst < end); 4082 } 4083 4084 4085 4086 4087 4088 static void 4089 syminfo_2L11_tom(Elf64_Syminfo *dst, unsigned char *src, size_t cnt) 4090 { 4091 Elf64_Syminfo *end = dst; 4092 4093 dst += cnt; 4094 src += cnt * SI1_sizeof; 4095 while (dst-- > end) 4096 { 4097 src -= SI1_sizeof; 4098 dst->si_boundto = (((Elf64_Half)(src)[SI1_boundto_L1]<<8)+(src)[SI1_boundto_L0]); 4099 dst->si_flags = (((Elf64_Half)(src)[SI1_flags_L1]<<8)+(src)[SI1_flags_L0]); 4100 } 4101 } 4102 4103 static void 4104 syminfo_2M11_tom(Elf64_Syminfo *dst, unsigned char *src, size_t cnt) 4105 { 4106 Elf64_Syminfo *end = dst; 4107 4108 dst += cnt; 4109 src += cnt * SI1_sizeof; 4110 while (dst-- > end) 4111 { 4112 src -= SI1_sizeof; 4113 dst->si_boundto = (((Elf64_Half)(src)[SI1_boundto_M1]<<8)+(src)[SI1_boundto_M0]); 4114 dst->si_flags = (((Elf64_Half)(src)[SI1_flags_M1]<<8)+(src)[SI1_flags_M0]); 4115 } 4116 } 4117 4118 4119 4120 4121 4122 static void 4123 sym_2L11_tom(Elf64_Sym *dst, Byte *src, size_t cnt) 4124 { 4125 Elf64_Sym *end = dst; 4126 4127 dst += cnt; 4128 src += cnt * ST1_sizeof; 4129 while (dst-- > end) { 4130 src -= ST1_sizeof; 4131 dst->st_size = (((((((((((Elf64_Xword)(src)[ST1_size_L7]<<8) 4132 +(src)[ST1_size_L6]<<8) 4133 +(src)[ST1_size_L5]<<8) 4134 +(src)[ST1_size_L4]<<8) 4135 +(src)[ST1_size_L3]<<8) 4136 +(src)[ST1_size_L2])<<8) 4137 +(src)[ST1_size_L1])<<8) 4138 +(src)[ST1_size_L0]); 4139 dst->st_value = (((((((((((Elf64_Addr)(src)[ST1_value_L7]<<8) 4140 +(src)[ST1_value_L6]<<8) 4141 +(src)[ST1_value_L5]<<8) 4142 +(src)[ST1_value_L4]<<8) 4143 +(src)[ST1_value_L3]<<8) 4144 +(src)[ST1_value_L2])<<8) 4145 +(src)[ST1_value_L1])<<8) 4146 +(src)[ST1_value_L0]); 4147 dst->st_shndx = (((Elf64_Half)(src)[ST1_shndx_L1]<<8)+(src)[ST1_shndx_L0]); 4148 dst->st_other = ((Byte)(src)[ST1_other_L]); 4149 dst->st_info = ((Byte)(src)[ST1_info_L]); 4150 dst->st_name = (((((((Elf64_Word)(src)[ST1_name_L3]<<8) 4151 +(src)[ST1_name_L2])<<8) 4152 +(src)[ST1_name_L1])<<8) 4153 +(src)[ST1_name_L0]); 4154 } 4155 } 4156 4157 static void 4158 sym_2M11_tom(Elf64_Sym *dst, Byte *src, size_t cnt) 4159 { 4160 Elf64_Sym *end = dst; 4161 4162 dst += cnt; 4163 src += cnt * ST1_sizeof; 4164 while (dst-- > end) { 4165 src -= ST1_sizeof; 4166 dst->st_size = (((((((((((Elf64_Xword)(src)[ST1_size_M7]<<8) 4167 +(src)[ST1_size_M6]<<8) 4168 +(src)[ST1_size_M5]<<8) 4169 +(src)[ST1_size_M4]<<8) 4170 +(src)[ST1_size_M3]<<8) 4171 +(src)[ST1_size_M2])<<8) 4172 +(src)[ST1_size_M1])<<8) 4173 +(src)[ST1_size_M0]); 4174 dst->st_value = (((((((((((Elf64_Addr)(src)[ST1_value_M7]<<8) 4175 +(src)[ST1_value_M6]<<8) 4176 +(src)[ST1_value_M5]<<8) 4177 +(src)[ST1_value_M4]<<8) 4178 +(src)[ST1_value_M3]<<8) 4179 +(src)[ST1_value_M2])<<8) 4180 +(src)[ST1_value_M1])<<8) 4181 +(src)[ST1_value_M0]); 4182 dst->st_shndx = (((Elf64_Half)(src)[ST1_shndx_M1]<<8)+(src)[ST1_shndx_M0]); 4183 dst->st_other = ((Byte)(src)[ST1_other_M]); 4184 dst->st_info = ((Byte)(src)[ST1_info_M]); 4185 dst->st_name = (((((((Elf64_Word)(src)[ST1_name_M3]<<8) 4186 +(src)[ST1_name_M2])<<8) 4187 +(src)[ST1_name_M1])<<8) 4188 +(src)[ST1_name_M0]); 4189 } 4190 } 4191 4192 4193 4194 4195 4196 static void 4197 word_2L_tom(Elf64_Word *dst, Byte *src, size_t cnt) 4198 { 4199 Elf64_Word *end = dst; 4200 4201 dst += cnt; 4202 src += cnt * W_sizeof; 4203 while (dst-- > end) { 4204 src -= W_sizeof; 4205 *dst = (((((((Elf64_Word)(src)[W_L3]<<8) 4206 +(src)[W_L2])<<8) 4207 +(src)[W_L1])<<8) 4208 +(src)[W_L0]); 4209 } 4210 } 4211 4212 static void 4213 word_2M_tom(Elf64_Word *dst, Byte *src, size_t cnt) 4214 { 4215 Elf64_Word *end = dst; 4216 4217 dst += cnt; 4218 src += cnt * W_sizeof; 4219 while (dst-- > end) { 4220 src -= W_sizeof; 4221 *dst = (((((((Elf64_Word)(src)[W_M3]<<8) 4222 +(src)[W_M2])<<8) 4223 +(src)[W_M1])<<8) 4224 +(src)[W_M0]); 4225 } 4226 } 4227 4228 4229 4230 4231 4232 static void 4233 verdef_2L11_tom(Elf64_Verdef *dst, Byte *src, size_t cnt) 4234 { 4235 /* LINTED */ 4236 Elf64_Verdef *end = (Elf64_Verdef *)((Byte *)dst + cnt); 4237 4238 while (dst < end) { 4239 Elf64_Verdaux *vaux; 4240 Byte *src_vaux; 4241 Elf64_Half i; 4242 4243 dst->vd_version = (((Elf64_Half)(src)[VD1_version_L1]<<8)+(src)[VD1_version_L0]); 4244 dst->vd_flags = (((Elf64_Half)(src)[VD1_flags_L1]<<8)+(src)[VD1_flags_L0]); 4245 dst->vd_ndx = (((Elf64_Half)(src)[VD1_ndx_L1]<<8)+(src)[VD1_ndx_L0]); 4246 dst->vd_cnt = (((Elf64_Half)(src)[VD1_cnt_L1]<<8)+(src)[VD1_cnt_L0]); 4247 dst->vd_hash = (((((((Elf64_Word)(src)[VD1_hash_L3]<<8) 4248 +(src)[VD1_hash_L2])<<8) 4249 +(src)[VD1_hash_L1])<<8) 4250 +(src)[VD1_hash_L0]); 4251 dst->vd_aux = (((((((Elf64_Word)(src)[VD1_aux_L3]<<8) 4252 +(src)[VD1_aux_L2])<<8) 4253 +(src)[VD1_aux_L1])<<8) 4254 +(src)[VD1_aux_L0]); 4255 dst->vd_next = (((((((Elf64_Word)(src)[VD1_next_L3]<<8) 4256 +(src)[VD1_next_L2])<<8) 4257 +(src)[VD1_next_L1])<<8) 4258 +(src)[VD1_next_L0]); 4259 4260 src_vaux = src + dst->vd_aux; 4261 /* LINTED */ 4262 vaux = (Elf64_Verdaux *)((Byte *)dst + dst->vd_aux); 4263 for (i = 0; i < dst->vd_cnt; i++) { 4264 vaux->vda_name = (((((((Elf64_Word)(src_vaux)[VDA1_name_L3]<<8) 4265 +(src_vaux)[VDA1_name_L2])<<8) 4266 +(src_vaux)[VDA1_name_L1])<<8) 4267 +(src_vaux)[VDA1_name_L0]); 4268 vaux->vda_next = (((((((Elf64_Word)(src_vaux)[VDA1_next_L3]<<8) 4269 +(src_vaux)[VDA1_next_L2])<<8) 4270 +(src_vaux)[VDA1_next_L1])<<8) 4271 +(src_vaux)[VDA1_next_L0]); 4272 src_vaux += vaux->vda_next; 4273 /* LINTED */ 4274 vaux = (Elf64_Verdaux *)((Byte *)vaux + 4275 vaux->vda_next); 4276 } 4277 src += dst->vd_next; 4278 /* LINTED */ 4279 dst = (Elf64_Verdef *)(dst->vd_next ? 4280 (Byte *)dst + dst->vd_next : (Byte *)end); 4281 } 4282 } 4283 4284 static void 4285 verdef_2M11_tom(Elf64_Verdef *dst, Byte *src, size_t cnt) 4286 { 4287 /* LINTED */ 4288 Elf64_Verdef *end = (Elf64_Verdef *)((Byte *)dst + cnt); 4289 4290 while (dst < end) { 4291 Elf64_Verdaux *vaux; 4292 Byte *src_vaux; 4293 Elf64_Half i; 4294 4295 dst->vd_version = (((Elf64_Half)(src)[VD1_version_M1]<<8)+(src)[VD1_version_M0]); 4296 dst->vd_flags = (((Elf64_Half)(src)[VD1_flags_M1]<<8)+(src)[VD1_flags_M0]); 4297 dst->vd_ndx = (((Elf64_Half)(src)[VD1_ndx_M1]<<8)+(src)[VD1_ndx_M0]); 4298 dst->vd_cnt = (((Elf64_Half)(src)[VD1_cnt_M1]<<8)+(src)[VD1_cnt_M0]); 4299 dst->vd_hash = (((((((Elf64_Word)(src)[VD1_hash_M3]<<8) 4300 +(src)[VD1_hash_M2])<<8) 4301 +(src)[VD1_hash_M1])<<8) 4302 +(src)[VD1_hash_M0]); 4303 dst->vd_aux = (((((((Elf64_Word)(src)[VD1_aux_M3]<<8) 4304 +(src)[VD1_aux_M2])<<8) 4305 +(src)[VD1_aux_M1])<<8) 4306 +(src)[VD1_aux_M0]); 4307 dst->vd_next = (((((((Elf64_Word)(src)[VD1_next_M3]<<8) 4308 +(src)[VD1_next_M2])<<8) 4309 +(src)[VD1_next_M1])<<8) 4310 +(src)[VD1_next_M0]); 4311 4312 src_vaux = src + dst->vd_aux; 4313 /* LINTED */ 4314 vaux = (Elf64_Verdaux *)((Byte *)dst + dst->vd_aux); 4315 for (i = 0; i < dst->vd_cnt; i++) { 4316 vaux->vda_name = (((((((Elf64_Word)(src_vaux)[VDA1_name_M3]<<8) 4317 +(src_vaux)[VDA1_name_M2])<<8) 4318 +(src_vaux)[VDA1_name_M1])<<8) 4319 +(src_vaux)[VDA1_name_M0]); 4320 vaux->vda_next = (((((((Elf64_Word)(src_vaux)[VDA1_next_M3]<<8) 4321 +(src_vaux)[VDA1_next_M2])<<8) 4322 +(src_vaux)[VDA1_next_M1])<<8) 4323 +(src_vaux)[VDA1_next_M0]); 4324 src_vaux += vaux->vda_next; 4325 /* LINTED */ 4326 vaux = (Elf64_Verdaux *)((Byte *)vaux + 4327 vaux->vda_next); 4328 } 4329 src += dst->vd_next; 4330 /* LINTED */ 4331 dst = (Elf64_Verdef *)(dst->vd_next ? 4332 (Byte *)dst + dst->vd_next : (Byte *)end); 4333 } 4334 } 4335 4336 4337 4338 4339 4340 static void 4341 verneed_2L11_tom(Elf64_Verneed *dst, Byte *src, size_t cnt) 4342 { 4343 /* LINTED */ 4344 Elf64_Verneed *end = (Elf64_Verneed *)((char *)dst + cnt); 4345 4346 while (dst < end) { 4347 Elf64_Vernaux * vaux; 4348 Byte * src_vaux; 4349 Elf64_Half i; 4350 4351 dst->vn_version = (((Elf64_Half)(src)[VN1_version_L1]<<8)+(src)[VN1_version_L0]); 4352 dst->vn_cnt = (((Elf64_Half)(src)[VN1_cnt_L1]<<8)+(src)[VN1_cnt_L0]); 4353 dst->vn_file = (((((((Elf64_Word)(src)[VN1_file_L3]<<8) 4354 +(src)[VN1_file_L2])<<8) 4355 +(src)[VN1_file_L1])<<8) 4356 +(src)[VN1_file_L0]); 4357 dst->vn_aux = (((((((Elf64_Word)(src)[VN1_aux_L3]<<8) 4358 +(src)[VN1_aux_L2])<<8) 4359 +(src)[VN1_aux_L1])<<8) 4360 +(src)[VN1_aux_L0]); 4361 dst->vn_next = (((((((Elf64_Word)(src)[VN1_next_L3]<<8) 4362 +(src)[VN1_next_L2])<<8) 4363 +(src)[VN1_next_L1])<<8) 4364 +(src)[VN1_next_L0]); 4365 4366 src_vaux = src + dst->vn_aux; 4367 /* LINTED */ 4368 vaux = (Elf64_Vernaux *)((Byte *)dst + dst->vn_aux); 4369 for (i = 0; i < dst->vn_cnt; i++) { 4370 vaux->vna_hash = (((((((Elf64_Word)(src_vaux)[VNA1_hash_L3]<<8) 4371 +(src_vaux)[VNA1_hash_L2])<<8) 4372 +(src_vaux)[VNA1_hash_L1])<<8) 4373 +(src_vaux)[VNA1_hash_L0]); 4374 vaux->vna_flags = (((Elf64_Half)(src_vaux)[VNA1_flags_L1]<<8)+(src_vaux)[VNA1_flags_L0]); 4375 vaux->vna_other = (((Elf64_Half)(src_vaux)[VNA1_other_L1]<<8)+(src_vaux)[VNA1_other_L0]); 4376 vaux->vna_name = (((((((Elf64_Word)(src_vaux)[VNA1_name_L3]<<8) 4377 +(src_vaux)[VNA1_name_L2])<<8) 4378 +(src_vaux)[VNA1_name_L1])<<8) 4379 +(src_vaux)[VNA1_name_L0]); 4380 vaux->vna_next = (((((((Elf64_Word)(src_vaux)[VNA1_next_L3]<<8) 4381 +(src_vaux)[VNA1_next_L2])<<8) 4382 +(src_vaux)[VNA1_next_L1])<<8) 4383 +(src_vaux)[VNA1_next_L0]); 4384 src_vaux += vaux->vna_next; 4385 /* LINTED */ 4386 vaux = (Elf64_Vernaux *)((Byte *)vaux + 4387 vaux->vna_next); 4388 } 4389 src += dst->vn_next; 4390 /* LINTED */ 4391 dst = (Elf64_Verneed *)(dst->vn_next ? 4392 (Byte *)dst + dst->vn_next : (Byte *)end); 4393 } 4394 } 4395 4396 static void 4397 verneed_2M11_tom(Elf64_Verneed *dst, Byte *src, size_t cnt) 4398 { 4399 /* LINTED */ 4400 Elf64_Verneed *end = (Elf64_Verneed *)((char *)dst + cnt); 4401 4402 while (dst < end) { 4403 Elf64_Vernaux * vaux; 4404 Byte * src_vaux; 4405 Elf64_Half i; 4406 4407 dst->vn_version = (((Elf64_Half)(src)[VN1_version_M1]<<8)+(src)[VN1_version_M0]); 4408 dst->vn_cnt = (((Elf64_Half)(src)[VN1_cnt_M1]<<8)+(src)[VN1_cnt_M0]); 4409 dst->vn_file = (((((((Elf64_Word)(src)[VN1_file_M3]<<8) 4410 +(src)[VN1_file_M2])<<8) 4411 +(src)[VN1_file_M1])<<8) 4412 +(src)[VN1_file_M0]); 4413 dst->vn_aux = (((((((Elf64_Word)(src)[VN1_aux_M3]<<8) 4414 +(src)[VN1_aux_M2])<<8) 4415 +(src)[VN1_aux_M1])<<8) 4416 +(src)[VN1_aux_M0]); 4417 dst->vn_next = (((((((Elf64_Word)(src)[VN1_next_M3]<<8) 4418 +(src)[VN1_next_M2])<<8) 4419 +(src)[VN1_next_M1])<<8) 4420 +(src)[VN1_next_M0]); 4421 4422 src_vaux = src + dst->vn_aux; 4423 /* LINTED */ 4424 vaux = (Elf64_Vernaux *)((Byte *)dst + dst->vn_aux); 4425 for (i = 0; i < dst->vn_cnt; i++) { 4426 vaux->vna_hash = (((((((Elf64_Word)(src_vaux)[VNA1_hash_M3]<<8) 4427 +(src_vaux)[VNA1_hash_M2])<<8) 4428 +(src_vaux)[VNA1_hash_M1])<<8) 4429 +(src_vaux)[VNA1_hash_M0]); 4430 vaux->vna_flags = (((Elf64_Half)(src_vaux)[VNA1_flags_M1]<<8)+(src_vaux)[VNA1_flags_M0]); 4431 vaux->vna_other = (((Elf64_Half)(src_vaux)[VNA1_other_M1]<<8)+(src_vaux)[VNA1_other_M0]); 4432 vaux->vna_name = (((((((Elf64_Word)(src_vaux)[VNA1_name_M3]<<8) 4433 +(src_vaux)[VNA1_name_M2])<<8) 4434 +(src_vaux)[VNA1_name_M1])<<8) 4435 +(src_vaux)[VNA1_name_M0]); 4436 vaux->vna_next = (((((((Elf64_Word)(src_vaux)[VNA1_next_M3]<<8) 4437 +(src_vaux)[VNA1_next_M2])<<8) 4438 +(src_vaux)[VNA1_next_M1])<<8) 4439 +(src_vaux)[VNA1_next_M0]); 4440 src_vaux += vaux->vna_next; 4441 /* LINTED */ 4442 vaux = (Elf64_Vernaux *)((Byte *)vaux + 4443 vaux->vna_next); 4444 } 4445 src += dst->vn_next; 4446 /* LINTED */ 4447 dst = (Elf64_Verneed *)(dst->vn_next ? 4448 (Byte *)dst + dst->vn_next : (Byte *)end); 4449 } 4450 } 4451 4452 4453 4454 4455 4456 static void 4457 sxword_2L_tom(Elf64_Sxword *dst, Byte *src, size_t cnt) 4458 { 4459 Elf64_Sxword *end = dst; 4460 4461 dst += cnt; 4462 src += cnt * X_sizeof; 4463 while (dst-- > end) { 4464 src -= X_sizeof; 4465 /*CONSTANTCONDITION*/ 4466 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1 && 4467 ~(~(Elf64_Xword)0 >> 1) == HI64) { /* 2s comp */ 4468 *dst = (((((((((((Elf64_Xword)(src)[X_L7]<<8) 4469 +(src)[X_L6]<<8) 4470 +(src)[X_L5]<<8) 4471 +(src)[X_L4]<<8) 4472 +(src)[X_L3]<<8) 4473 +(src)[X_L2])<<8) 4474 +(src)[X_L1])<<8) 4475 +(src)[X_L0]); 4476 } else { /* other */ 4477 union { 4478 Elf64_Xword w; 4479 Elf64_Sxword sw; 4480 } u; 4481 4482 if ((u.w = (((((((((((Elf64_Xword)(src)[X_L7]<<8) 4483 +(src)[X_L6]<<8) 4484 +(src)[X_L5]<<8) 4485 +(src)[X_L4]<<8) 4486 +(src)[X_L3]<<8) 4487 +(src)[X_L2])<<8) 4488 +(src)[X_L1])<<8) 4489 +(src)[X_L0])) & HI64) { 4490 /* LINTED */ 4491 u.w |= ~(Elf64_Xword)LO63; 4492 u.w = ~u.w + 1; 4493 u.sw = -u.w; 4494 } 4495 *dst = u.sw; 4496 } 4497 } 4498 } 4499 4500 static void 4501 sxword_2M_tom(Elf64_Sxword *dst, Byte *src, size_t cnt) 4502 { 4503 Elf64_Sxword *end = dst; 4504 4505 dst += cnt; 4506 src += cnt * X_sizeof; 4507 while (dst-- > end) { 4508 src -= X_sizeof; 4509 /*CONSTANTCONDITION*/ 4510 if (~(Elf64_Xword)0 == -(Elf64_Sxword)1 && 4511 ~(~(Elf64_Xword)0 >> 1) == HI64) { /* 2s comp */ 4512 *dst = (((((((((((Elf64_Xword)(src)[X_M7]<<8) 4513 +(src)[X_M6]<<8) 4514 +(src)[X_M5]<<8) 4515 +(src)[X_M4]<<8) 4516 +(src)[X_M3]<<8) 4517 +(src)[X_M2])<<8) 4518 +(src)[X_M1])<<8) 4519 +(src)[X_M0]); 4520 } else { /* other */ 4521 union { 4522 Elf64_Xword w; 4523 Elf64_Sxword sw; 4524 } u; 4525 4526 if ((u.w = (((((((((((Elf64_Xword)(src)[X_M7]<<8) 4527 +(src)[X_M6]<<8) 4528 +(src)[X_M5]<<8) 4529 +(src)[X_M4]<<8) 4530 +(src)[X_M3]<<8) 4531 +(src)[X_M2])<<8) 4532 +(src)[X_M1])<<8) 4533 +(src)[X_M0])) & HI64) { 4534 /* LINTED */ 4535 u.w |= ~(Elf64_Xword)LO63; 4536 u.w = ~u.w + 1; 4537 u.sw = -u.w; 4538 } 4539 *dst = u.sw; 4540 } 4541 } 4542 } 4543 4544 4545 4546 4547 4548 static void 4549 xword_2L_tom(Elf64_Xword *dst, Byte *src, size_t cnt) 4550 { 4551 Elf64_Xword *end = dst; 4552 4553 dst += cnt; 4554 src += cnt * X_sizeof; 4555 while (dst-- > end) { 4556 src -= X_sizeof; 4557 *dst = (((((((((((Elf64_Xword)(src)[X_L7]<<8) 4558 +(src)[X_L6]<<8) 4559 +(src)[X_L5]<<8) 4560 +(src)[X_L4]<<8) 4561 +(src)[X_L3]<<8) 4562 +(src)[X_L2])<<8) 4563 +(src)[X_L1])<<8) 4564 +(src)[X_L0]); 4565 } 4566 } 4567 4568 static void 4569 xword_2M_tom(Elf64_Xword *dst, Byte *src, size_t cnt) 4570 { 4571 Elf64_Xword *end = dst; 4572 4573 dst += cnt; 4574 src += cnt * X_sizeof; 4575 while (dst-- > end) { 4576 src -= X_sizeof; 4577 *dst = (((((((((((Elf64_Xword)(src)[X_M7]<<8) 4578 +(src)[X_M6]<<8) 4579 +(src)[X_M5]<<8) 4580 +(src)[X_M4]<<8) 4581 +(src)[X_M3]<<8) 4582 +(src)[X_M2])<<8) 4583 +(src)[X_M1])<<8) 4584 +(src)[X_M0]); 4585 } 4586 } 4587