github.com/sean-/go@v0.0.0-20151219100004-97f854cd7bb6/src/cmd/link/internal/ld/elf.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package ld 6 7 import ( 8 "cmd/internal/obj" 9 "crypto/sha1" 10 "encoding/binary" 11 "fmt" 12 "path/filepath" 13 "sort" 14 "strings" 15 ) 16 17 /* 18 * Derived from: 19 * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.1 2005/12/30 22:13:58 marcel Exp $ 20 * $FreeBSD: src/sys/sys/elf64.h,v 1.10.14.1 2005/12/30 22:13:58 marcel Exp $ 21 * $FreeBSD: src/sys/sys/elf_common.h,v 1.15.8.1 2005/12/30 22:13:58 marcel Exp $ 22 * $FreeBSD: src/sys/alpha/include/elf.h,v 1.14 2003/09/25 01:10:22 peter Exp $ 23 * $FreeBSD: src/sys/amd64/include/elf.h,v 1.18 2004/08/03 08:21:48 dfr Exp $ 24 * $FreeBSD: src/sys/arm/include/elf.h,v 1.5.2.1 2006/06/30 21:42:52 cognet Exp $ 25 * $FreeBSD: src/sys/i386/include/elf.h,v 1.16 2004/08/02 19:12:17 dfr Exp $ 26 * $FreeBSD: src/sys/powerpc/include/elf.h,v 1.7 2004/11/02 09:47:01 ssouhlal Exp $ 27 * $FreeBSD: src/sys/sparc64/include/elf.h,v 1.12 2003/09/25 01:10:26 peter Exp $ 28 * 29 * Copyright (c) 1996-1998 John D. Polstra. All rights reserved. 30 * Copyright (c) 2001 David E. O'Brien 31 * Portions Copyright 2009 The Go Authors. All rights reserved. 32 * 33 * Redistribution and use in source and binary forms, with or without 34 * modification, are permitted provided that the following conditions 35 * are met: 36 * 1. Redistributions of source code must retain the above copyright 37 * notice, this list of conditions and the following disclaimer. 38 * 2. Redistributions in binary form must reproduce the above copyright 39 * notice, this list of conditions and the following disclaimer in the 40 * documentation and/or other materials provided with the distribution. 41 * 42 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 45 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52 * SUCH DAMAGE. 53 * 54 */ 55 56 /* 57 * ELF definitions that are independent of architecture or word size. 58 */ 59 60 /* 61 * Note header. The ".note" section contains an array of notes. Each 62 * begins with this header, aligned to a word boundary. Immediately 63 * following the note header is n_namesz bytes of name, padded to the 64 * next word boundary. Then comes n_descsz bytes of descriptor, again 65 * padded to a word boundary. The values of n_namesz and n_descsz do 66 * not include the padding. 67 */ 68 type Elf_Note struct { 69 n_namesz uint32 70 n_descsz uint32 71 n_type uint32 72 } 73 74 const ( 75 EI_MAG0 = 0 76 EI_MAG1 = 1 77 EI_MAG2 = 2 78 EI_MAG3 = 3 79 EI_CLASS = 4 80 EI_DATA = 5 81 EI_VERSION = 6 82 EI_OSABI = 7 83 EI_ABIVERSION = 8 84 OLD_EI_BRAND = 8 85 EI_PAD = 9 86 EI_NIDENT = 16 87 ELFMAG0 = 0x7f 88 ELFMAG1 = 'E' 89 ELFMAG2 = 'L' 90 ELFMAG3 = 'F' 91 SELFMAG = 4 92 EV_NONE = 0 93 EV_CURRENT = 1 94 ELFCLASSNONE = 0 95 ELFCLASS32 = 1 96 ELFCLASS64 = 2 97 ELFDATANONE = 0 98 ELFDATA2LSB = 1 99 ELFDATA2MSB = 2 100 ELFOSABI_NONE = 0 101 ELFOSABI_HPUX = 1 102 ELFOSABI_NETBSD = 2 103 ELFOSABI_LINUX = 3 104 ELFOSABI_HURD = 4 105 ELFOSABI_86OPEN = 5 106 ELFOSABI_SOLARIS = 6 107 ELFOSABI_AIX = 7 108 ELFOSABI_IRIX = 8 109 ELFOSABI_FREEBSD = 9 110 ELFOSABI_TRU64 = 10 111 ELFOSABI_MODESTO = 11 112 ELFOSABI_OPENBSD = 12 113 ELFOSABI_OPENVMS = 13 114 ELFOSABI_NSK = 14 115 ELFOSABI_ARM = 97 116 ELFOSABI_STANDALONE = 255 117 ELFOSABI_SYSV = ELFOSABI_NONE 118 ELFOSABI_MONTEREY = ELFOSABI_AIX 119 ET_NONE = 0 120 ET_REL = 1 121 ET_EXEC = 2 122 ET_DYN = 3 123 ET_CORE = 4 124 ET_LOOS = 0xfe00 125 ET_HIOS = 0xfeff 126 ET_LOPROC = 0xff00 127 ET_HIPROC = 0xffff 128 EM_NONE = 0 129 EM_M32 = 1 130 EM_SPARC = 2 131 EM_386 = 3 132 EM_68K = 4 133 EM_88K = 5 134 EM_860 = 7 135 EM_MIPS = 8 136 EM_S370 = 9 137 EM_MIPS_RS3_LE = 10 138 EM_PARISC = 15 139 EM_VPP500 = 17 140 EM_SPARC32PLUS = 18 141 EM_960 = 19 142 EM_PPC = 20 143 EM_PPC64 = 21 144 EM_S390 = 22 145 EM_V800 = 36 146 EM_FR20 = 37 147 EM_RH32 = 38 148 EM_RCE = 39 149 EM_ARM = 40 150 EM_SH = 42 151 EM_SPARCV9 = 43 152 EM_TRICORE = 44 153 EM_ARC = 45 154 EM_H8_300 = 46 155 EM_H8_300H = 47 156 EM_H8S = 48 157 EM_H8_500 = 49 158 EM_IA_64 = 50 159 EM_MIPS_X = 51 160 EM_COLDFIRE = 52 161 EM_68HC12 = 53 162 EM_MMA = 54 163 EM_PCP = 55 164 EM_NCPU = 56 165 EM_NDR1 = 57 166 EM_STARCORE = 58 167 EM_ME16 = 59 168 EM_ST100 = 60 169 EM_TINYJ = 61 170 EM_X86_64 = 62 171 EM_AARCH64 = 183 172 EM_486 = 6 173 EM_MIPS_RS4_BE = 10 174 EM_ALPHA_STD = 41 175 EM_ALPHA = 0x9026 176 SHN_UNDEF = 0 177 SHN_LORESERVE = 0xff00 178 SHN_LOPROC = 0xff00 179 SHN_HIPROC = 0xff1f 180 SHN_LOOS = 0xff20 181 SHN_HIOS = 0xff3f 182 SHN_ABS = 0xfff1 183 SHN_COMMON = 0xfff2 184 SHN_XINDEX = 0xffff 185 SHN_HIRESERVE = 0xffff 186 SHT_NULL = 0 187 SHT_PROGBITS = 1 188 SHT_SYMTAB = 2 189 SHT_STRTAB = 3 190 SHT_RELA = 4 191 SHT_HASH = 5 192 SHT_DYNAMIC = 6 193 SHT_NOTE = 7 194 SHT_NOBITS = 8 195 SHT_REL = 9 196 SHT_SHLIB = 10 197 SHT_DYNSYM = 11 198 SHT_INIT_ARRAY = 14 199 SHT_FINI_ARRAY = 15 200 SHT_PREINIT_ARRAY = 16 201 SHT_GROUP = 17 202 SHT_SYMTAB_SHNDX = 18 203 SHT_LOOS = 0x60000000 204 SHT_HIOS = 0x6fffffff 205 SHT_GNU_VERDEF = 0x6ffffffd 206 SHT_GNU_VERNEED = 0x6ffffffe 207 SHT_GNU_VERSYM = 0x6fffffff 208 SHT_LOPROC = 0x70000000 209 SHT_ARM_ATTRIBUTES = 0x70000003 210 SHT_HIPROC = 0x7fffffff 211 SHT_LOUSER = 0x80000000 212 SHT_HIUSER = 0xffffffff 213 SHF_WRITE = 0x1 214 SHF_ALLOC = 0x2 215 SHF_EXECINSTR = 0x4 216 SHF_MERGE = 0x10 217 SHF_STRINGS = 0x20 218 SHF_INFO_LINK = 0x40 219 SHF_LINK_ORDER = 0x80 220 SHF_OS_NONCONFORMING = 0x100 221 SHF_GROUP = 0x200 222 SHF_TLS = 0x400 223 SHF_MASKOS = 0x0ff00000 224 SHF_MASKPROC = 0xf0000000 225 PT_NULL = 0 226 PT_LOAD = 1 227 PT_DYNAMIC = 2 228 PT_INTERP = 3 229 PT_NOTE = 4 230 PT_SHLIB = 5 231 PT_PHDR = 6 232 PT_TLS = 7 233 PT_LOOS = 0x60000000 234 PT_HIOS = 0x6fffffff 235 PT_LOPROC = 0x70000000 236 PT_HIPROC = 0x7fffffff 237 PT_GNU_STACK = 0x6474e551 238 PT_PAX_FLAGS = 0x65041580 239 PF_X = 0x1 240 PF_W = 0x2 241 PF_R = 0x4 242 PF_MASKOS = 0x0ff00000 243 PF_MASKPROC = 0xf0000000 244 DT_NULL = 0 245 DT_NEEDED = 1 246 DT_PLTRELSZ = 2 247 DT_PLTGOT = 3 248 DT_HASH = 4 249 DT_STRTAB = 5 250 DT_SYMTAB = 6 251 DT_RELA = 7 252 DT_RELASZ = 8 253 DT_RELAENT = 9 254 DT_STRSZ = 10 255 DT_SYMENT = 11 256 DT_INIT = 12 257 DT_FINI = 13 258 DT_SONAME = 14 259 DT_RPATH = 15 260 DT_SYMBOLIC = 16 261 DT_REL = 17 262 DT_RELSZ = 18 263 DT_RELENT = 19 264 DT_PLTREL = 20 265 DT_DEBUG = 21 266 DT_TEXTREL = 22 267 DT_JMPREL = 23 268 DT_BIND_NOW = 24 269 DT_INIT_ARRAY = 25 270 DT_FINI_ARRAY = 26 271 DT_INIT_ARRAYSZ = 27 272 DT_FINI_ARRAYSZ = 28 273 DT_RUNPATH = 29 274 DT_FLAGS = 30 275 DT_ENCODING = 32 276 DT_PREINIT_ARRAY = 32 277 DT_PREINIT_ARRAYSZ = 33 278 DT_LOOS = 0x6000000d 279 DT_HIOS = 0x6ffff000 280 DT_LOPROC = 0x70000000 281 DT_HIPROC = 0x7fffffff 282 DT_VERNEED = 0x6ffffffe 283 DT_VERNEEDNUM = 0x6fffffff 284 DT_VERSYM = 0x6ffffff0 285 DT_PPC64_GLINK = DT_LOPROC + 0 286 DT_PPC64_OPT = DT_LOPROC + 3 287 DF_ORIGIN = 0x0001 288 DF_SYMBOLIC = 0x0002 289 DF_TEXTREL = 0x0004 290 DF_BIND_NOW = 0x0008 291 DF_STATIC_TLS = 0x0010 292 NT_PRSTATUS = 1 293 NT_FPREGSET = 2 294 NT_PRPSINFO = 3 295 STB_LOCAL = 0 296 STB_GLOBAL = 1 297 STB_WEAK = 2 298 STB_LOOS = 10 299 STB_HIOS = 12 300 STB_LOPROC = 13 301 STB_HIPROC = 15 302 STT_NOTYPE = 0 303 STT_OBJECT = 1 304 STT_FUNC = 2 305 STT_SECTION = 3 306 STT_FILE = 4 307 STT_COMMON = 5 308 STT_TLS = 6 309 STT_LOOS = 10 310 STT_HIOS = 12 311 STT_LOPROC = 13 312 STT_HIPROC = 15 313 STV_DEFAULT = 0x0 314 STV_INTERNAL = 0x1 315 STV_HIDDEN = 0x2 316 STV_PROTECTED = 0x3 317 STN_UNDEF = 0 318 ) 319 320 /* For accessing the fields of r_info. */ 321 322 /* For constructing r_info from field values. */ 323 324 /* 325 * Relocation types. 326 */ 327 const ( 328 R_X86_64_NONE = 0 329 R_X86_64_64 = 1 330 R_X86_64_PC32 = 2 331 R_X86_64_GOT32 = 3 332 R_X86_64_PLT32 = 4 333 R_X86_64_COPY = 5 334 R_X86_64_GLOB_DAT = 6 335 R_X86_64_JMP_SLOT = 7 336 R_X86_64_RELATIVE = 8 337 R_X86_64_GOTPCREL = 9 338 R_X86_64_32 = 10 339 R_X86_64_32S = 11 340 R_X86_64_16 = 12 341 R_X86_64_PC16 = 13 342 R_X86_64_8 = 14 343 R_X86_64_PC8 = 15 344 R_X86_64_DTPMOD64 = 16 345 R_X86_64_DTPOFF64 = 17 346 R_X86_64_TPOFF64 = 18 347 R_X86_64_TLSGD = 19 348 R_X86_64_TLSLD = 20 349 R_X86_64_DTPOFF32 = 21 350 R_X86_64_GOTTPOFF = 22 351 R_X86_64_TPOFF32 = 23 352 R_X86_64_PC64 = 24 353 R_X86_64_GOTOFF64 = 25 354 R_X86_64_GOTPC32 = 26 355 R_X86_64_GOT64 = 27 356 R_X86_64_GOTPCREL64 = 28 357 R_X86_64_GOTPC64 = 29 358 R_X86_64_GOTPLT64 = 30 359 R_X86_64_PLTOFF64 = 31 360 R_X86_64_SIZE32 = 32 361 R_X86_64_SIZE64 = 33 362 R_X86_64_GOTPC32_TLSDEC = 34 363 R_X86_64_TLSDESC_CALL = 35 364 R_X86_64_TLSDESC = 36 365 R_X86_64_IRELATIVE = 37 366 R_X86_64_PC32_BND = 40 367 R_X86_64_GOTPCRELX = 41 368 R_X86_64_REX_GOTPCRELX = 42 369 370 R_AARCH64_ABS64 = 257 371 R_AARCH64_ABS32 = 258 372 R_AARCH64_CALL26 = 283 373 R_AARCH64_ADR_PREL_PG_HI21 = 275 374 R_AARCH64_ADD_ABS_LO12_NC = 277 375 R_AARCH64_LDST8_ABS_LO12_NC = 278 376 R_AARCH64_LDST16_ABS_LO12_NC = 284 377 R_AARCH64_LDST32_ABS_LO12_NC = 285 378 R_AARCH64_LDST64_ABS_LO12_NC = 286 379 R_AARCH64_ADR_GOT_PAGE = 311 380 R_AARCH64_LD64_GOT_LO12_NC = 312 381 R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 = 541 382 R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC = 542 383 R_AARCH64_TLSLE_MOVW_TPREL_G0 = 547 384 385 R_ALPHA_NONE = 0 386 R_ALPHA_REFLONG = 1 387 R_ALPHA_REFQUAD = 2 388 R_ALPHA_GPREL32 = 3 389 R_ALPHA_LITERAL = 4 390 R_ALPHA_LITUSE = 5 391 R_ALPHA_GPDISP = 6 392 R_ALPHA_BRADDR = 7 393 R_ALPHA_HINT = 8 394 R_ALPHA_SREL16 = 9 395 R_ALPHA_SREL32 = 10 396 R_ALPHA_SREL64 = 11 397 R_ALPHA_OP_PUSH = 12 398 R_ALPHA_OP_STORE = 13 399 R_ALPHA_OP_PSUB = 14 400 R_ALPHA_OP_PRSHIFT = 15 401 R_ALPHA_GPVALUE = 16 402 R_ALPHA_GPRELHIGH = 17 403 R_ALPHA_GPRELLOW = 18 404 R_ALPHA_IMMED_GP_16 = 19 405 R_ALPHA_IMMED_GP_HI32 = 20 406 R_ALPHA_IMMED_SCN_HI32 = 21 407 R_ALPHA_IMMED_BR_HI32 = 22 408 R_ALPHA_IMMED_LO32 = 23 409 R_ALPHA_COPY = 24 410 R_ALPHA_GLOB_DAT = 25 411 R_ALPHA_JMP_SLOT = 26 412 R_ALPHA_RELATIVE = 27 413 414 R_ARM_NONE = 0 415 R_ARM_PC24 = 1 416 R_ARM_ABS32 = 2 417 R_ARM_REL32 = 3 418 R_ARM_PC13 = 4 419 R_ARM_ABS16 = 5 420 R_ARM_ABS12 = 6 421 R_ARM_THM_ABS5 = 7 422 R_ARM_ABS8 = 8 423 R_ARM_SBREL32 = 9 424 R_ARM_THM_PC22 = 10 425 R_ARM_THM_PC8 = 11 426 R_ARM_AMP_VCALL9 = 12 427 R_ARM_SWI24 = 13 428 R_ARM_THM_SWI8 = 14 429 R_ARM_XPC25 = 15 430 R_ARM_THM_XPC22 = 16 431 R_ARM_COPY = 20 432 R_ARM_GLOB_DAT = 21 433 R_ARM_JUMP_SLOT = 22 434 R_ARM_RELATIVE = 23 435 R_ARM_GOTOFF = 24 436 R_ARM_GOTPC = 25 437 R_ARM_GOT32 = 26 438 R_ARM_PLT32 = 27 439 R_ARM_CALL = 28 440 R_ARM_JUMP24 = 29 441 R_ARM_V4BX = 40 442 R_ARM_GOT_PREL = 96 443 R_ARM_GNU_VTENTRY = 100 444 R_ARM_GNU_VTINHERIT = 101 445 R_ARM_TLS_IE32 = 107 446 R_ARM_TLS_LE32 = 108 447 R_ARM_RSBREL32 = 250 448 R_ARM_THM_RPC22 = 251 449 R_ARM_RREL32 = 252 450 R_ARM_RABS32 = 253 451 R_ARM_RPC24 = 254 452 R_ARM_RBASE = 255 453 454 R_386_NONE = 0 455 R_386_32 = 1 456 R_386_PC32 = 2 457 R_386_GOT32 = 3 458 R_386_PLT32 = 4 459 R_386_COPY = 5 460 R_386_GLOB_DAT = 6 461 R_386_JMP_SLOT = 7 462 R_386_RELATIVE = 8 463 R_386_GOTOFF = 9 464 R_386_GOTPC = 10 465 R_386_TLS_TPOFF = 14 466 R_386_TLS_IE = 15 467 R_386_TLS_GOTIE = 16 468 R_386_TLS_LE = 17 469 R_386_TLS_GD = 18 470 R_386_TLS_LDM = 19 471 R_386_TLS_GD_32 = 24 472 R_386_TLS_GD_PUSH = 25 473 R_386_TLS_GD_CALL = 26 474 R_386_TLS_GD_POP = 27 475 R_386_TLS_LDM_32 = 28 476 R_386_TLS_LDM_PUSH = 29 477 R_386_TLS_LDM_CALL = 30 478 R_386_TLS_LDM_POP = 31 479 R_386_TLS_LDO_32 = 32 480 R_386_TLS_IE_32 = 33 481 R_386_TLS_LE_32 = 34 482 R_386_TLS_DTPMOD32 = 35 483 R_386_TLS_DTPOFF32 = 36 484 R_386_TLS_TPOFF32 = 37 485 R_386_TLS_GOTDESC = 39 486 R_386_TLS_DESC_CALL = 40 487 R_386_TLS_DESC = 41 488 R_386_IRELATIVE = 42 489 R_386_GOT32X = 43 490 491 R_PPC_NONE = 0 492 R_PPC_ADDR32 = 1 493 R_PPC_ADDR24 = 2 494 R_PPC_ADDR16 = 3 495 R_PPC_ADDR16_LO = 4 496 R_PPC_ADDR16_HI = 5 497 R_PPC_ADDR16_HA = 6 498 R_PPC_ADDR14 = 7 499 R_PPC_ADDR14_BRTAKEN = 8 500 R_PPC_ADDR14_BRNTAKEN = 9 501 R_PPC_REL24 = 10 502 R_PPC_REL14 = 11 503 R_PPC_REL14_BRTAKEN = 12 504 R_PPC_REL14_BRNTAKEN = 13 505 R_PPC_GOT16 = 14 506 R_PPC_GOT16_LO = 15 507 R_PPC_GOT16_HI = 16 508 R_PPC_GOT16_HA = 17 509 R_PPC_PLTREL24 = 18 510 R_PPC_COPY = 19 511 R_PPC_GLOB_DAT = 20 512 R_PPC_JMP_SLOT = 21 513 R_PPC_RELATIVE = 22 514 R_PPC_LOCAL24PC = 23 515 R_PPC_UADDR32 = 24 516 R_PPC_UADDR16 = 25 517 R_PPC_REL32 = 26 518 R_PPC_PLT32 = 27 519 R_PPC_PLTREL32 = 28 520 R_PPC_PLT16_LO = 29 521 R_PPC_PLT16_HI = 30 522 R_PPC_PLT16_HA = 31 523 R_PPC_SDAREL16 = 32 524 R_PPC_SECTOFF = 33 525 R_PPC_SECTOFF_LO = 34 526 R_PPC_SECTOFF_HI = 35 527 R_PPC_SECTOFF_HA = 36 528 R_PPC_TLS = 67 529 R_PPC_DTPMOD32 = 68 530 R_PPC_TPREL16 = 69 531 R_PPC_TPREL16_LO = 70 532 R_PPC_TPREL16_HI = 71 533 R_PPC_TPREL16_HA = 72 534 R_PPC_TPREL32 = 73 535 R_PPC_DTPREL16 = 74 536 R_PPC_DTPREL16_LO = 75 537 R_PPC_DTPREL16_HI = 76 538 R_PPC_DTPREL16_HA = 77 539 R_PPC_DTPREL32 = 78 540 R_PPC_GOT_TLSGD16 = 79 541 R_PPC_GOT_TLSGD16_LO = 80 542 R_PPC_GOT_TLSGD16_HI = 81 543 R_PPC_GOT_TLSGD16_HA = 82 544 R_PPC_GOT_TLSLD16 = 83 545 R_PPC_GOT_TLSLD16_LO = 84 546 R_PPC_GOT_TLSLD16_HI = 85 547 R_PPC_GOT_TLSLD16_HA = 86 548 R_PPC_GOT_TPREL16 = 87 549 R_PPC_GOT_TPREL16_LO = 88 550 R_PPC_GOT_TPREL16_HI = 89 551 R_PPC_GOT_TPREL16_HA = 90 552 R_PPC_EMB_NADDR32 = 101 553 R_PPC_EMB_NADDR16 = 102 554 R_PPC_EMB_NADDR16_LO = 103 555 R_PPC_EMB_NADDR16_HI = 104 556 R_PPC_EMB_NADDR16_HA = 105 557 R_PPC_EMB_SDAI16 = 106 558 R_PPC_EMB_SDA2I16 = 107 559 R_PPC_EMB_SDA2REL = 108 560 R_PPC_EMB_SDA21 = 109 561 R_PPC_EMB_MRKREF = 110 562 R_PPC_EMB_RELSEC16 = 111 563 R_PPC_EMB_RELST_LO = 112 564 R_PPC_EMB_RELST_HI = 113 565 R_PPC_EMB_RELST_HA = 114 566 R_PPC_EMB_BIT_FLD = 115 567 R_PPC_EMB_RELSDA = 116 568 569 R_PPC64_ADDR32 = R_PPC_ADDR32 570 R_PPC64_ADDR16_LO = R_PPC_ADDR16_LO 571 R_PPC64_ADDR16_HA = R_PPC_ADDR16_HA 572 R_PPC64_REL24 = R_PPC_REL24 573 R_PPC64_GOT16_HA = R_PPC_GOT16_HA 574 R_PPC64_JMP_SLOT = R_PPC_JMP_SLOT 575 R_PPC64_TPREL16 = R_PPC_TPREL16 576 R_PPC64_ADDR64 = 38 577 R_PPC64_TOC16 = 47 578 R_PPC64_TOC16_LO = 48 579 R_PPC64_TOC16_HI = 49 580 R_PPC64_TOC16_HA = 50 581 R_PPC64_ADDR16_LO_DS = 57 582 R_PPC64_GOT16_LO_DS = 59 583 R_PPC64_TOC16_DS = 63 584 R_PPC64_TOC16_LO_DS = 64 585 R_PPC64_TLS = 67 586 R_PPC64_GOT_TPREL16_LO_DS = 88 587 R_PPC64_GOT_TPREL16_HA = 90 588 R_PPC64_REL16_LO = 250 589 R_PPC64_REL16_HI = 251 590 R_PPC64_REL16_HA = 252 591 592 R_SPARC_NONE = 0 593 R_SPARC_8 = 1 594 R_SPARC_16 = 2 595 R_SPARC_32 = 3 596 R_SPARC_DISP8 = 4 597 R_SPARC_DISP16 = 5 598 R_SPARC_DISP32 = 6 599 R_SPARC_WDISP30 = 7 600 R_SPARC_WDISP22 = 8 601 R_SPARC_HI22 = 9 602 R_SPARC_22 = 10 603 R_SPARC_13 = 11 604 R_SPARC_LO10 = 12 605 R_SPARC_GOT10 = 13 606 R_SPARC_GOT13 = 14 607 R_SPARC_GOT22 = 15 608 R_SPARC_PC10 = 16 609 R_SPARC_PC22 = 17 610 R_SPARC_WPLT30 = 18 611 R_SPARC_COPY = 19 612 R_SPARC_GLOB_DAT = 20 613 R_SPARC_JMP_SLOT = 21 614 R_SPARC_RELATIVE = 22 615 R_SPARC_UA32 = 23 616 R_SPARC_PLT32 = 24 617 R_SPARC_HIPLT22 = 25 618 R_SPARC_LOPLT10 = 26 619 R_SPARC_PCPLT32 = 27 620 R_SPARC_PCPLT22 = 28 621 R_SPARC_PCPLT10 = 29 622 R_SPARC_10 = 30 623 R_SPARC_11 = 31 624 R_SPARC_64 = 32 625 R_SPARC_OLO10 = 33 626 R_SPARC_HH22 = 34 627 R_SPARC_HM10 = 35 628 R_SPARC_LM22 = 36 629 R_SPARC_PC_HH22 = 37 630 R_SPARC_PC_HM10 = 38 631 R_SPARC_PC_LM22 = 39 632 R_SPARC_WDISP16 = 40 633 R_SPARC_WDISP19 = 41 634 R_SPARC_GLOB_JMP = 42 635 R_SPARC_7 = 43 636 R_SPARC_5 = 44 637 R_SPARC_6 = 45 638 R_SPARC_DISP64 = 46 639 R_SPARC_PLT64 = 47 640 R_SPARC_HIX22 = 48 641 R_SPARC_LOX10 = 49 642 R_SPARC_H44 = 50 643 R_SPARC_M44 = 51 644 R_SPARC_L44 = 52 645 R_SPARC_REGISTER = 53 646 R_SPARC_UA64 = 54 647 R_SPARC_UA16 = 55 648 649 ARM_MAGIC_TRAMP_NUMBER = 0x5c000003 650 ) 651 652 /* 653 * Symbol table entries. 654 */ 655 656 /* For accessing the fields of st_info. */ 657 658 /* For constructing st_info from field values. */ 659 660 /* For accessing the fields of st_other. */ 661 662 /* 663 * ELF header. 664 */ 665 type ElfEhdr struct { 666 ident [EI_NIDENT]uint8 667 type_ uint16 668 machine uint16 669 version uint32 670 entry uint64 671 phoff uint64 672 shoff uint64 673 flags uint32 674 ehsize uint16 675 phentsize uint16 676 phnum uint16 677 shentsize uint16 678 shnum uint16 679 shstrndx uint16 680 } 681 682 /* 683 * Section header. 684 */ 685 type ElfShdr struct { 686 name uint32 687 type_ uint32 688 flags uint64 689 addr uint64 690 off uint64 691 size uint64 692 link uint32 693 info uint32 694 addralign uint64 695 entsize uint64 696 shnum int 697 secsym *LSym 698 } 699 700 /* 701 * Program header. 702 */ 703 type ElfPhdr struct { 704 type_ uint32 705 flags uint32 706 off uint64 707 vaddr uint64 708 paddr uint64 709 filesz uint64 710 memsz uint64 711 align uint64 712 } 713 714 /* For accessing the fields of r_info. */ 715 716 /* For constructing r_info from field values. */ 717 718 /* 719 * Symbol table entries. 720 */ 721 722 /* For accessing the fields of st_info. */ 723 724 /* For constructing st_info from field values. */ 725 726 /* For accessing the fields of st_other. */ 727 728 /* 729 * Go linker interface 730 */ 731 const ( 732 ELF64HDRSIZE = 64 733 ELF64PHDRSIZE = 56 734 ELF64SHDRSIZE = 64 735 ELF64RELSIZE = 16 736 ELF64RELASIZE = 24 737 ELF64SYMSIZE = 24 738 ELF32HDRSIZE = 52 739 ELF32PHDRSIZE = 32 740 ELF32SHDRSIZE = 40 741 ELF32SYMSIZE = 16 742 ELF32RELSIZE = 8 743 ) 744 745 /* 746 * The interface uses the 64-bit structures always, 747 * to avoid code duplication. The writers know how to 748 * marshal a 32-bit representation from the 64-bit structure. 749 */ 750 751 var Elfstrdat []byte 752 753 /* 754 * Total amount of space to reserve at the start of the file 755 * for Header, PHeaders, SHeaders, and interp. 756 * May waste some. 757 * On FreeBSD, cannot be larger than a page. 758 */ 759 const ( 760 ELFRESERVE = 4096 761 ) 762 763 /* 764 * We use the 64-bit data structures on both 32- and 64-bit machines 765 * in order to write the code just once. The 64-bit data structure is 766 * written in the 32-bit format on the 32-bit machines. 767 */ 768 const ( 769 NSECT = 48 770 ) 771 772 var Iself bool 773 774 var Nelfsym int = 1 775 776 var elf64 bool 777 778 var ehdr ElfEhdr 779 780 var phdr [NSECT]*ElfPhdr 781 782 var shdr [NSECT]*ElfShdr 783 784 var interp string 785 786 type Elfstring struct { 787 s string 788 off int 789 } 790 791 var elfstr [100]Elfstring 792 793 var nelfstr int 794 795 var buildinfo []byte 796 797 /* 798 Initialize the global variable that describes the ELF header. It will be updated as 799 we write section and prog headers. 800 */ 801 func Elfinit() { 802 Iself = true 803 804 switch Thearch.Thechar { 805 // 64-bit architectures 806 case '9': 807 if Ctxt.Arch.ByteOrder == binary.BigEndian { 808 ehdr.flags = 1 /* Version 1 ABI */ 809 } else { 810 ehdr.flags = 2 /* Version 2 ABI */ 811 } 812 fallthrough 813 814 case '0', '6', '7': 815 if Thearch.Thechar == '0' { 816 ehdr.flags = 0x20000000 /* MIPS 3 */ 817 } 818 elf64 = true 819 820 ehdr.phoff = ELF64HDRSIZE /* Must be be ELF64HDRSIZE: first PHdr must follow ELF header */ 821 ehdr.shoff = ELF64HDRSIZE /* Will move as we add PHeaders */ 822 ehdr.ehsize = ELF64HDRSIZE /* Must be ELF64HDRSIZE */ 823 ehdr.phentsize = ELF64PHDRSIZE /* Must be ELF64PHDRSIZE */ 824 ehdr.shentsize = ELF64SHDRSIZE /* Must be ELF64SHDRSIZE */ 825 826 // we use EABI on both linux/arm and freebsd/arm. 827 // 32-bit architectures 828 case '5': 829 // we use EABI on both linux/arm and freebsd/arm. 830 if HEADTYPE == obj.Hlinux || HEADTYPE == obj.Hfreebsd { 831 // We set a value here that makes no indication of which 832 // float ABI the object uses, because this is information 833 // used by the dynamic linker to compare executables and 834 // shared libraries -- so it only matters for cgo calls, and 835 // the information properly comes from the object files 836 // produced by the host C compiler. parseArmAttributes in 837 // ldelf.go reads that information and updates this field as 838 // appropriate. 839 ehdr.flags = 0x5000002 // has entry point, Version5 EABI 840 } 841 fallthrough 842 843 default: 844 ehdr.phoff = ELF32HDRSIZE 845 /* Must be be ELF32HDRSIZE: first PHdr must follow ELF header */ 846 ehdr.shoff = ELF32HDRSIZE /* Will move as we add PHeaders */ 847 ehdr.ehsize = ELF32HDRSIZE /* Must be ELF32HDRSIZE */ 848 ehdr.phentsize = ELF32PHDRSIZE /* Must be ELF32PHDRSIZE */ 849 ehdr.shentsize = ELF32SHDRSIZE /* Must be ELF32SHDRSIZE */ 850 } 851 } 852 853 func elf64phdr(e *ElfPhdr) { 854 Thearch.Lput(e.type_) 855 Thearch.Lput(e.flags) 856 Thearch.Vput(e.off) 857 Thearch.Vput(e.vaddr) 858 Thearch.Vput(e.paddr) 859 Thearch.Vput(e.filesz) 860 Thearch.Vput(e.memsz) 861 Thearch.Vput(e.align) 862 } 863 864 func elf32phdr(e *ElfPhdr) { 865 if e.type_ == PT_LOAD { 866 // Correct ELF loaders will do this implicitly, 867 // but buggy ELF loaders like the one in some 868 // versions of QEMU won't. 869 frag := int(e.vaddr & (e.align - 1)) 870 871 e.off -= uint64(frag) 872 e.vaddr -= uint64(frag) 873 e.paddr -= uint64(frag) 874 e.filesz += uint64(frag) 875 e.memsz += uint64(frag) 876 } 877 878 Thearch.Lput(e.type_) 879 Thearch.Lput(uint32(e.off)) 880 Thearch.Lput(uint32(e.vaddr)) 881 Thearch.Lput(uint32(e.paddr)) 882 Thearch.Lput(uint32(e.filesz)) 883 Thearch.Lput(uint32(e.memsz)) 884 Thearch.Lput(e.flags) 885 Thearch.Lput(uint32(e.align)) 886 } 887 888 func elf64shdr(e *ElfShdr) { 889 Thearch.Lput(e.name) 890 Thearch.Lput(e.type_) 891 Thearch.Vput(e.flags) 892 Thearch.Vput(e.addr) 893 Thearch.Vput(e.off) 894 Thearch.Vput(e.size) 895 Thearch.Lput(e.link) 896 Thearch.Lput(e.info) 897 Thearch.Vput(e.addralign) 898 Thearch.Vput(e.entsize) 899 } 900 901 func elf32shdr(e *ElfShdr) { 902 Thearch.Lput(e.name) 903 Thearch.Lput(e.type_) 904 Thearch.Lput(uint32(e.flags)) 905 Thearch.Lput(uint32(e.addr)) 906 Thearch.Lput(uint32(e.off)) 907 Thearch.Lput(uint32(e.size)) 908 Thearch.Lput(e.link) 909 Thearch.Lput(e.info) 910 Thearch.Lput(uint32(e.addralign)) 911 Thearch.Lput(uint32(e.entsize)) 912 } 913 914 func elfwriteshdrs() uint32 { 915 if elf64 { 916 for i := 0; i < int(ehdr.shnum); i++ { 917 elf64shdr(shdr[i]) 918 } 919 return uint32(ehdr.shnum) * ELF64SHDRSIZE 920 } 921 922 for i := 0; i < int(ehdr.shnum); i++ { 923 elf32shdr(shdr[i]) 924 } 925 return uint32(ehdr.shnum) * ELF32SHDRSIZE 926 } 927 928 func elfsetstring(s string, off int) { 929 if nelfstr >= len(elfstr) { 930 Diag("too many elf strings") 931 errorexit() 932 } 933 934 elfstr[nelfstr].s = s 935 elfstr[nelfstr].off = off 936 nelfstr++ 937 } 938 939 func elfwritephdrs() uint32 { 940 if elf64 { 941 for i := 0; i < int(ehdr.phnum); i++ { 942 elf64phdr(phdr[i]) 943 } 944 return uint32(ehdr.phnum) * ELF64PHDRSIZE 945 } 946 947 for i := 0; i < int(ehdr.phnum); i++ { 948 elf32phdr(phdr[i]) 949 } 950 return uint32(ehdr.phnum) * ELF32PHDRSIZE 951 } 952 953 func newElfPhdr() *ElfPhdr { 954 e := new(ElfPhdr) 955 if ehdr.phnum >= NSECT { 956 Diag("too many phdrs") 957 } else { 958 phdr[ehdr.phnum] = e 959 ehdr.phnum++ 960 } 961 if elf64 { 962 ehdr.shoff += ELF64PHDRSIZE 963 } else { 964 ehdr.shoff += ELF32PHDRSIZE 965 } 966 return e 967 } 968 969 func newElfShdr(name int64) *ElfShdr { 970 e := new(ElfShdr) 971 e.name = uint32(name) 972 e.shnum = int(ehdr.shnum) 973 if ehdr.shnum >= NSECT { 974 Diag("too many shdrs") 975 } else { 976 shdr[ehdr.shnum] = e 977 ehdr.shnum++ 978 } 979 980 return e 981 } 982 983 func getElfEhdr() *ElfEhdr { 984 return &ehdr 985 } 986 987 func elf64writehdr() uint32 { 988 for i := 0; i < EI_NIDENT; i++ { 989 Cput(ehdr.ident[i]) 990 } 991 Thearch.Wput(ehdr.type_) 992 Thearch.Wput(ehdr.machine) 993 Thearch.Lput(ehdr.version) 994 Thearch.Vput(ehdr.entry) 995 Thearch.Vput(ehdr.phoff) 996 Thearch.Vput(ehdr.shoff) 997 Thearch.Lput(ehdr.flags) 998 Thearch.Wput(ehdr.ehsize) 999 Thearch.Wput(ehdr.phentsize) 1000 Thearch.Wput(ehdr.phnum) 1001 Thearch.Wput(ehdr.shentsize) 1002 Thearch.Wput(ehdr.shnum) 1003 Thearch.Wput(ehdr.shstrndx) 1004 return ELF64HDRSIZE 1005 } 1006 1007 func elf32writehdr() uint32 { 1008 for i := 0; i < EI_NIDENT; i++ { 1009 Cput(ehdr.ident[i]) 1010 } 1011 Thearch.Wput(ehdr.type_) 1012 Thearch.Wput(ehdr.machine) 1013 Thearch.Lput(ehdr.version) 1014 Thearch.Lput(uint32(ehdr.entry)) 1015 Thearch.Lput(uint32(ehdr.phoff)) 1016 Thearch.Lput(uint32(ehdr.shoff)) 1017 Thearch.Lput(ehdr.flags) 1018 Thearch.Wput(ehdr.ehsize) 1019 Thearch.Wput(ehdr.phentsize) 1020 Thearch.Wput(ehdr.phnum) 1021 Thearch.Wput(ehdr.shentsize) 1022 Thearch.Wput(ehdr.shnum) 1023 Thearch.Wput(ehdr.shstrndx) 1024 return ELF32HDRSIZE 1025 } 1026 1027 func elfwritehdr() uint32 { 1028 if elf64 { 1029 return elf64writehdr() 1030 } 1031 return elf32writehdr() 1032 } 1033 1034 /* Taken directly from the definition document for ELF64 */ 1035 func elfhash(name []byte) uint32 { 1036 var h uint32 = 0 1037 var g uint32 1038 for len(name) != 0 { 1039 h = (h << 4) + uint32(name[0]) 1040 name = name[1:] 1041 g = h & 0xf0000000 1042 if g != 0 { 1043 h ^= g >> 24 1044 } 1045 h &= 0x0fffffff 1046 } 1047 1048 return h 1049 } 1050 1051 func Elfwritedynent(s *LSym, tag int, val uint64) { 1052 if elf64 { 1053 Adduint64(Ctxt, s, uint64(tag)) 1054 Adduint64(Ctxt, s, val) 1055 } else { 1056 Adduint32(Ctxt, s, uint32(tag)) 1057 Adduint32(Ctxt, s, uint32(val)) 1058 } 1059 } 1060 1061 func elfwritedynentsym(s *LSym, tag int, t *LSym) { 1062 Elfwritedynentsymplus(s, tag, t, 0) 1063 } 1064 1065 func Elfwritedynentsymplus(s *LSym, tag int, t *LSym, add int64) { 1066 if elf64 { 1067 Adduint64(Ctxt, s, uint64(tag)) 1068 } else { 1069 Adduint32(Ctxt, s, uint32(tag)) 1070 } 1071 Addaddrplus(Ctxt, s, t, add) 1072 } 1073 1074 func elfwritedynentsymsize(s *LSym, tag int, t *LSym) { 1075 if elf64 { 1076 Adduint64(Ctxt, s, uint64(tag)) 1077 } else { 1078 Adduint32(Ctxt, s, uint32(tag)) 1079 } 1080 addsize(Ctxt, s, t) 1081 } 1082 1083 func elfinterp(sh *ElfShdr, startva uint64, resoff uint64, p string) int { 1084 interp = p 1085 n := len(interp) + 1 1086 sh.addr = startva + resoff - uint64(n) 1087 sh.off = resoff - uint64(n) 1088 sh.size = uint64(n) 1089 1090 return n 1091 } 1092 1093 func elfwriteinterp() int { 1094 sh := elfshname(".interp") 1095 Cseek(int64(sh.off)) 1096 coutbuf.WriteString(interp) 1097 Cput(0) 1098 return int(sh.size) 1099 } 1100 1101 func elfnote(sh *ElfShdr, startva uint64, resoff uint64, sz int, alloc bool) int { 1102 n := 3*4 + uint64(sz) + resoff%4 1103 1104 sh.type_ = SHT_NOTE 1105 if alloc { 1106 sh.flags = SHF_ALLOC 1107 } 1108 sh.addralign = 4 1109 sh.addr = startva + resoff - n 1110 sh.off = resoff - n 1111 sh.size = n - resoff%4 1112 1113 return int(n) 1114 } 1115 1116 func elfwritenotehdr(str string, namesz uint32, descsz uint32, tag uint32) *ElfShdr { 1117 sh := elfshname(str) 1118 1119 // Write Elf_Note header. 1120 Cseek(int64(sh.off)) 1121 1122 Thearch.Lput(namesz) 1123 Thearch.Lput(descsz) 1124 Thearch.Lput(tag) 1125 1126 return sh 1127 } 1128 1129 // NetBSD Signature (as per sys/exec_elf.h) 1130 const ( 1131 ELF_NOTE_NETBSD_NAMESZ = 7 1132 ELF_NOTE_NETBSD_DESCSZ = 4 1133 ELF_NOTE_NETBSD_TAG = 1 1134 ELF_NOTE_NETBSD_VERSION = 599000000 /* NetBSD 5.99 */ 1135 ) 1136 1137 var ELF_NOTE_NETBSD_NAME = []byte("NetBSD\x00") 1138 1139 func elfnetbsdsig(sh *ElfShdr, startva uint64, resoff uint64) int { 1140 n := int(Rnd(ELF_NOTE_NETBSD_NAMESZ, 4) + Rnd(ELF_NOTE_NETBSD_DESCSZ, 4)) 1141 return elfnote(sh, startva, resoff, n, true) 1142 } 1143 1144 func elfwritenetbsdsig() int { 1145 // Write Elf_Note header. 1146 sh := elfwritenotehdr(".note.netbsd.ident", ELF_NOTE_NETBSD_NAMESZ, ELF_NOTE_NETBSD_DESCSZ, ELF_NOTE_NETBSD_TAG) 1147 1148 if sh == nil { 1149 return 0 1150 } 1151 1152 // Followed by NetBSD string and version. 1153 Cwrite(ELF_NOTE_NETBSD_NAME) 1154 Cput(0) 1155 1156 Thearch.Lput(ELF_NOTE_NETBSD_VERSION) 1157 1158 return int(sh.size) 1159 } 1160 1161 // OpenBSD Signature 1162 const ( 1163 ELF_NOTE_OPENBSD_NAMESZ = 8 1164 ELF_NOTE_OPENBSD_DESCSZ = 4 1165 ELF_NOTE_OPENBSD_TAG = 1 1166 ELF_NOTE_OPENBSD_VERSION = 0 1167 ) 1168 1169 var ELF_NOTE_OPENBSD_NAME = []byte("OpenBSD\x00") 1170 1171 func elfopenbsdsig(sh *ElfShdr, startva uint64, resoff uint64) int { 1172 n := ELF_NOTE_OPENBSD_NAMESZ + ELF_NOTE_OPENBSD_DESCSZ 1173 return elfnote(sh, startva, resoff, n, true) 1174 } 1175 1176 func elfwriteopenbsdsig() int { 1177 // Write Elf_Note header. 1178 sh := elfwritenotehdr(".note.openbsd.ident", ELF_NOTE_OPENBSD_NAMESZ, ELF_NOTE_OPENBSD_DESCSZ, ELF_NOTE_OPENBSD_TAG) 1179 1180 if sh == nil { 1181 return 0 1182 } 1183 1184 // Followed by OpenBSD string and version. 1185 Cwrite(ELF_NOTE_OPENBSD_NAME) 1186 1187 Thearch.Lput(ELF_NOTE_OPENBSD_VERSION) 1188 1189 return int(sh.size) 1190 } 1191 1192 func addbuildinfo(val string) { 1193 var j int 1194 1195 if val[0] != '0' || val[1] != 'x' { 1196 Exitf("-B argument must start with 0x: %s", val) 1197 } 1198 1199 ov := val 1200 val = val[2:] 1201 i := 0 1202 var b int 1203 for val != "" { 1204 if len(val) == 1 { 1205 Exitf("-B argument must have even number of digits: %s", ov) 1206 } 1207 1208 b = 0 1209 for j = 0; j < 2; j, val = j+1, val[1:] { 1210 b *= 16 1211 if val[0] >= '0' && val[0] <= '9' { 1212 b += int(val[0]) - '0' 1213 } else if val[0] >= 'a' && val[0] <= 'f' { 1214 b += int(val[0]) - 'a' + 10 1215 } else if val[0] >= 'A' && val[0] <= 'F' { 1216 b += int(val[0]) - 'A' + 10 1217 } else { 1218 Exitf("-B argument contains invalid hex digit %c: %s", val[0], ov) 1219 } 1220 } 1221 1222 const maxLen = 32 1223 if i >= maxLen { 1224 Exitf("-B option too long (max %d digits): %s", maxLen, ov) 1225 } 1226 1227 buildinfo = append(buildinfo, uint8(b)) 1228 i++ 1229 } 1230 1231 buildinfo = buildinfo[:i] 1232 } 1233 1234 // Build info note 1235 const ( 1236 ELF_NOTE_BUILDINFO_NAMESZ = 4 1237 ELF_NOTE_BUILDINFO_TAG = 3 1238 ) 1239 1240 var ELF_NOTE_BUILDINFO_NAME = []byte("GNU\x00") 1241 1242 func elfbuildinfo(sh *ElfShdr, startva uint64, resoff uint64) int { 1243 n := int(ELF_NOTE_BUILDINFO_NAMESZ + Rnd(int64(len(buildinfo)), 4)) 1244 return elfnote(sh, startva, resoff, n, true) 1245 } 1246 1247 func elfgobuildid(sh *ElfShdr, startva uint64, resoff uint64) int { 1248 n := len(ELF_NOTE_GO_NAME) + int(Rnd(int64(len(buildid)), 4)) 1249 return elfnote(sh, startva, resoff, n, true) 1250 } 1251 1252 func elfwritebuildinfo() int { 1253 sh := elfwritenotehdr(".note.gnu.build-id", ELF_NOTE_BUILDINFO_NAMESZ, uint32(len(buildinfo)), ELF_NOTE_BUILDINFO_TAG) 1254 if sh == nil { 1255 return 0 1256 } 1257 1258 Cwrite(ELF_NOTE_BUILDINFO_NAME) 1259 Cwrite(buildinfo) 1260 var zero = make([]byte, 4) 1261 Cwrite(zero[:int(Rnd(int64(len(buildinfo)), 4)-int64(len(buildinfo)))]) 1262 1263 return int(sh.size) 1264 } 1265 1266 func elfwritegobuildid() int { 1267 sh := elfwritenotehdr(".note.go.buildid", uint32(len(ELF_NOTE_GO_NAME)), uint32(len(buildid)), ELF_NOTE_GOBUILDID_TAG) 1268 if sh == nil { 1269 return 0 1270 } 1271 1272 Cwrite(ELF_NOTE_GO_NAME) 1273 Cwrite([]byte(buildid)) 1274 var zero = make([]byte, 4) 1275 Cwrite(zero[:int(Rnd(int64(len(buildid)), 4)-int64(len(buildid)))]) 1276 1277 return int(sh.size) 1278 } 1279 1280 // Go specific notes 1281 const ( 1282 ELF_NOTE_GOPKGLIST_TAG = 1 1283 ELF_NOTE_GOABIHASH_TAG = 2 1284 ELF_NOTE_GODEPS_TAG = 3 1285 ELF_NOTE_GOBUILDID_TAG = 4 1286 ) 1287 1288 var ELF_NOTE_GO_NAME = []byte("Go\x00\x00") 1289 1290 var elfverneed int 1291 1292 type Elfaux struct { 1293 next *Elfaux 1294 num int 1295 vers string 1296 } 1297 1298 type Elflib struct { 1299 next *Elflib 1300 aux *Elfaux 1301 file string 1302 } 1303 1304 func addelflib(list **Elflib, file string, vers string) *Elfaux { 1305 var lib *Elflib 1306 1307 for lib = *list; lib != nil; lib = lib.next { 1308 if lib.file == file { 1309 goto havelib 1310 } 1311 } 1312 lib = new(Elflib) 1313 lib.next = *list 1314 lib.file = file 1315 *list = lib 1316 1317 havelib: 1318 for aux := lib.aux; aux != nil; aux = aux.next { 1319 if aux.vers == vers { 1320 return aux 1321 } 1322 } 1323 aux := new(Elfaux) 1324 aux.next = lib.aux 1325 aux.vers = vers 1326 lib.aux = aux 1327 1328 return aux 1329 } 1330 1331 func elfdynhash() { 1332 if !Iself { 1333 return 1334 } 1335 1336 nsym := Nelfsym 1337 s := Linklookup(Ctxt, ".hash", 0) 1338 s.Type = obj.SELFROSECT 1339 s.Reachable = true 1340 1341 i := nsym 1342 nbucket := 1 1343 for i > 0 { 1344 nbucket++ 1345 i >>= 1 1346 } 1347 1348 var needlib *Elflib 1349 need := make([]*Elfaux, nsym) 1350 chain := make([]uint32, nsym) 1351 buckets := make([]uint32, nbucket) 1352 1353 var b int 1354 var hc uint32 1355 var name string 1356 for sy := Ctxt.Allsym; sy != nil; sy = sy.Allsym { 1357 if sy.Dynid <= 0 { 1358 continue 1359 } 1360 1361 if sy.Dynimpvers != "" { 1362 need[sy.Dynid] = addelflib(&needlib, sy.Dynimplib, sy.Dynimpvers) 1363 } 1364 1365 name = sy.Extname 1366 hc = elfhash([]byte(name)) 1367 1368 b = int(hc % uint32(nbucket)) 1369 chain[sy.Dynid] = buckets[b] 1370 buckets[b] = uint32(sy.Dynid) 1371 } 1372 1373 Adduint32(Ctxt, s, uint32(nbucket)) 1374 Adduint32(Ctxt, s, uint32(nsym)) 1375 for i := 0; i < nbucket; i++ { 1376 Adduint32(Ctxt, s, buckets[i]) 1377 } 1378 for i := 0; i < nsym; i++ { 1379 Adduint32(Ctxt, s, chain[i]) 1380 } 1381 1382 // version symbols 1383 dynstr := Linklookup(Ctxt, ".dynstr", 0) 1384 1385 s = Linklookup(Ctxt, ".gnu.version_r", 0) 1386 i = 2 1387 nfile := 0 1388 var j int 1389 var x *Elfaux 1390 for l := needlib; l != nil; l = l.next { 1391 nfile++ 1392 1393 // header 1394 Adduint16(Ctxt, s, 1) // table version 1395 j = 0 1396 for x = l.aux; x != nil; x = x.next { 1397 j++ 1398 } 1399 Adduint16(Ctxt, s, uint16(j)) // aux count 1400 Adduint32(Ctxt, s, uint32(Addstring(dynstr, l.file))) // file string offset 1401 Adduint32(Ctxt, s, 16) // offset from header to first aux 1402 if l.next != nil { 1403 Adduint32(Ctxt, s, 16+uint32(j)*16) // offset from this header to next 1404 } else { 1405 Adduint32(Ctxt, s, 0) 1406 } 1407 1408 for x = l.aux; x != nil; x = x.next { 1409 x.num = i 1410 i++ 1411 1412 // aux struct 1413 Adduint32(Ctxt, s, elfhash([]byte(x.vers))) // hash 1414 Adduint16(Ctxt, s, 0) // flags 1415 Adduint16(Ctxt, s, uint16(x.num)) // other - index we refer to this by 1416 Adduint32(Ctxt, s, uint32(Addstring(dynstr, x.vers))) // version string offset 1417 if x.next != nil { 1418 Adduint32(Ctxt, s, 16) // offset from this aux to next 1419 } else { 1420 Adduint32(Ctxt, s, 0) 1421 } 1422 } 1423 } 1424 1425 // version references 1426 s = Linklookup(Ctxt, ".gnu.version", 0) 1427 1428 for i := 0; i < nsym; i++ { 1429 if i == 0 { 1430 Adduint16(Ctxt, s, 0) // first entry - no symbol 1431 } else if need[i] == nil { 1432 Adduint16(Ctxt, s, 1) // global 1433 } else { 1434 Adduint16(Ctxt, s, uint16(need[i].num)) 1435 } 1436 } 1437 1438 s = Linklookup(Ctxt, ".dynamic", 0) 1439 elfverneed = nfile 1440 if elfverneed != 0 { 1441 elfwritedynentsym(s, DT_VERNEED, Linklookup(Ctxt, ".gnu.version_r", 0)) 1442 Elfwritedynent(s, DT_VERNEEDNUM, uint64(nfile)) 1443 elfwritedynentsym(s, DT_VERSYM, Linklookup(Ctxt, ".gnu.version", 0)) 1444 } 1445 1446 switch Thearch.Thechar { 1447 case '0', '6', '7', '9': 1448 sy := Linklookup(Ctxt, ".rela.plt", 0) 1449 if sy.Size > 0 { 1450 Elfwritedynent(s, DT_PLTREL, DT_RELA) 1451 elfwritedynentsymsize(s, DT_PLTRELSZ, sy) 1452 elfwritedynentsym(s, DT_JMPREL, sy) 1453 } 1454 default: 1455 sy := Linklookup(Ctxt, ".rel.plt", 0) 1456 if sy.Size > 0 { 1457 Elfwritedynent(s, DT_PLTREL, DT_REL) 1458 elfwritedynentsymsize(s, DT_PLTRELSZ, sy) 1459 elfwritedynentsym(s, DT_JMPREL, sy) 1460 } 1461 } 1462 1463 Elfwritedynent(s, DT_NULL, 0) 1464 } 1465 1466 func elfphload(seg *Segment) *ElfPhdr { 1467 ph := newElfPhdr() 1468 ph.type_ = PT_LOAD 1469 if seg.Rwx&4 != 0 { 1470 ph.flags |= PF_R 1471 } 1472 if seg.Rwx&2 != 0 { 1473 ph.flags |= PF_W 1474 } 1475 if seg.Rwx&1 != 0 { 1476 ph.flags |= PF_X 1477 } 1478 ph.vaddr = seg.Vaddr 1479 ph.paddr = seg.Vaddr 1480 ph.memsz = seg.Length 1481 ph.off = seg.Fileoff 1482 ph.filesz = seg.Filelen 1483 ph.align = uint64(INITRND) 1484 1485 return ph 1486 } 1487 1488 func elfshname(name string) *ElfShdr { 1489 var off int 1490 var sh *ElfShdr 1491 1492 for i := 0; i < nelfstr; i++ { 1493 if name == elfstr[i].s { 1494 off = elfstr[i].off 1495 for i = 0; i < int(ehdr.shnum); i++ { 1496 sh = shdr[i] 1497 if sh.name == uint32(off) { 1498 return sh 1499 } 1500 } 1501 1502 sh = newElfShdr(int64(off)) 1503 return sh 1504 } 1505 } 1506 1507 Diag("cannot find elf name %s", name) 1508 errorexit() 1509 return nil 1510 } 1511 1512 func elfshalloc(sect *Section) *ElfShdr { 1513 sh := elfshname(sect.Name) 1514 sect.Elfsect = sh 1515 return sh 1516 } 1517 1518 func elfshbits(sect *Section) *ElfShdr { 1519 sh := elfshalloc(sect) 1520 // If this section has already been set up as a note, we assume type_ and 1521 // flags are already correct, but the other fields still need filling in. 1522 if sh.type_ == SHT_NOTE { 1523 if Linkmode != LinkExternal { 1524 // TODO(mwhudson): the approach here will work OK when 1525 // linking internally for notes that we want to be included 1526 // in a loadable segment (e.g. the abihash note) but not for 1527 // notes that we do not want to be mapped (e.g. the package 1528 // list note). The real fix is probably to define new values 1529 // for LSym.Type corresponding to mapped and unmapped notes 1530 // and handle them in dodata(). 1531 Diag("sh.type_ == SHT_NOTE in elfshbits when linking internally") 1532 } 1533 sh.addralign = uint64(sect.Align) 1534 sh.size = sect.Length 1535 sh.off = sect.Seg.Fileoff + sect.Vaddr - sect.Seg.Vaddr 1536 return sh 1537 } 1538 if sh.type_ > 0 { 1539 return sh 1540 } 1541 1542 if sect.Vaddr < sect.Seg.Vaddr+sect.Seg.Filelen { 1543 sh.type_ = SHT_PROGBITS 1544 } else { 1545 sh.type_ = SHT_NOBITS 1546 } 1547 sh.flags = SHF_ALLOC 1548 if sect.Rwx&1 != 0 { 1549 sh.flags |= SHF_EXECINSTR 1550 } 1551 if sect.Rwx&2 != 0 { 1552 sh.flags |= SHF_WRITE 1553 } 1554 if sect.Name == ".tbss" { 1555 sh.flags |= SHF_TLS 1556 sh.type_ = SHT_NOBITS 1557 } 1558 1559 if Linkmode != LinkExternal { 1560 sh.addr = sect.Vaddr 1561 } 1562 sh.addralign = uint64(sect.Align) 1563 sh.size = sect.Length 1564 if sect.Name != ".tbss" { 1565 sh.off = sect.Seg.Fileoff + sect.Vaddr - sect.Seg.Vaddr 1566 } 1567 1568 return sh 1569 } 1570 1571 func elfshreloc(sect *Section) *ElfShdr { 1572 // If main section is SHT_NOBITS, nothing to relocate. 1573 // Also nothing to relocate in .shstrtab or notes. 1574 if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { 1575 return nil 1576 } 1577 if sect.Name == ".shstrtab" || sect.Name == ".tbss" { 1578 return nil 1579 } 1580 if sect.Elfsect.type_ == SHT_NOTE { 1581 return nil 1582 } 1583 1584 var prefix string 1585 var typ int 1586 switch Thearch.Thechar { 1587 case '0', '6', '7', '9': 1588 prefix = ".rela" 1589 typ = SHT_RELA 1590 default: 1591 prefix = ".rel" 1592 typ = SHT_REL 1593 } 1594 1595 buf := fmt.Sprintf("%s%s", prefix, sect.Name) 1596 sh := elfshname(buf) 1597 sh.type_ = uint32(typ) 1598 sh.entsize = uint64(Thearch.Regsize) * 2 1599 if typ == SHT_RELA { 1600 sh.entsize += uint64(Thearch.Regsize) 1601 } 1602 sh.link = uint32(elfshname(".symtab").shnum) 1603 sh.info = uint32(sect.Elfsect.shnum) 1604 sh.off = sect.Reloff 1605 sh.size = sect.Rellen 1606 sh.addralign = uint64(Thearch.Regsize) 1607 return sh 1608 } 1609 1610 func elfrelocsect(sect *Section, first *LSym) { 1611 // If main section is SHT_NOBITS, nothing to relocate. 1612 // Also nothing to relocate in .shstrtab. 1613 if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { 1614 return 1615 } 1616 if sect.Name == ".shstrtab" { 1617 return 1618 } 1619 1620 sect.Reloff = uint64(Cpos()) 1621 var sym *LSym 1622 for sym = first; sym != nil; sym = sym.Next { 1623 if !sym.Reachable { 1624 continue 1625 } 1626 if uint64(sym.Value) >= sect.Vaddr { 1627 break 1628 } 1629 } 1630 1631 eaddr := int32(sect.Vaddr + sect.Length) 1632 var r *Reloc 1633 var ri int 1634 for ; sym != nil; sym = sym.Next { 1635 if !sym.Reachable { 1636 continue 1637 } 1638 if sym.Value >= int64(eaddr) { 1639 break 1640 } 1641 Ctxt.Cursym = sym 1642 1643 for ri = 0; ri < len(sym.R); ri++ { 1644 r = &sym.R[ri] 1645 if r.Done != 0 { 1646 continue 1647 } 1648 if r.Xsym == nil { 1649 Diag("missing xsym in relocation") 1650 continue 1651 } 1652 1653 if r.Xsym.ElfsymForReloc() == 0 { 1654 Diag("reloc %d to non-elf symbol %s (outer=%s) %d", r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type) 1655 } 1656 if Thearch.Elfreloc1(r, int64(uint64(sym.Value+int64(r.Off))-sect.Vaddr)) < 0 { 1657 Diag("unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name) 1658 } 1659 } 1660 } 1661 1662 sect.Rellen = uint64(Cpos()) - sect.Reloff 1663 } 1664 1665 func Elfemitreloc() { 1666 for Cpos()&7 != 0 { 1667 Cput(0) 1668 } 1669 1670 elfrelocsect(Segtext.Sect, Ctxt.Textp) 1671 for sect := Segtext.Sect.Next; sect != nil; sect = sect.Next { 1672 elfrelocsect(sect, datap) 1673 } 1674 for sect := Segrodata.Sect; sect != nil; sect = sect.Next { 1675 elfrelocsect(sect, datap) 1676 } 1677 for sect := Segdata.Sect; sect != nil; sect = sect.Next { 1678 elfrelocsect(sect, datap) 1679 } 1680 } 1681 1682 func addgonote(sectionName string, tag uint32, desc []byte) { 1683 s := Linklookup(Ctxt, sectionName, 0) 1684 s.Reachable = true 1685 s.Type = obj.SELFROSECT 1686 // namesz 1687 Adduint32(Ctxt, s, uint32(len(ELF_NOTE_GO_NAME))) 1688 // descsz 1689 Adduint32(Ctxt, s, uint32(len(desc))) 1690 // tag 1691 Adduint32(Ctxt, s, tag) 1692 // name + padding 1693 s.P = append(s.P, ELF_NOTE_GO_NAME...) 1694 for len(s.P)%4 != 0 { 1695 s.P = append(s.P, 0) 1696 } 1697 // desc + padding 1698 s.P = append(s.P, desc...) 1699 for len(s.P)%4 != 0 { 1700 s.P = append(s.P, 0) 1701 } 1702 s.Size = int64(len(s.P)) 1703 } 1704 1705 func doelf() { 1706 if !Iself { 1707 return 1708 } 1709 1710 /* predefine strings we need for section headers */ 1711 shstrtab := Linklookup(Ctxt, ".shstrtab", 0) 1712 1713 shstrtab.Type = obj.SELFROSECT 1714 shstrtab.Reachable = true 1715 1716 Addstring(shstrtab, "") 1717 Addstring(shstrtab, ".text") 1718 Addstring(shstrtab, ".noptrdata") 1719 Addstring(shstrtab, ".data") 1720 Addstring(shstrtab, ".bss") 1721 Addstring(shstrtab, ".noptrbss") 1722 1723 // generate .tbss section (except for OpenBSD where it's not supported) 1724 // for dynamic internal linker or external linking, so that various 1725 // binutils could correctly calculate PT_TLS size. 1726 // see https://golang.org/issue/5200. 1727 if HEADTYPE != obj.Hopenbsd { 1728 if Debug['d'] == 0 || Linkmode == LinkExternal { 1729 Addstring(shstrtab, ".tbss") 1730 } 1731 } 1732 if HEADTYPE == obj.Hnetbsd { 1733 Addstring(shstrtab, ".note.netbsd.ident") 1734 } 1735 if HEADTYPE == obj.Hopenbsd { 1736 Addstring(shstrtab, ".note.openbsd.ident") 1737 } 1738 if len(buildinfo) > 0 { 1739 Addstring(shstrtab, ".note.gnu.build-id") 1740 } 1741 if buildid != "" { 1742 Addstring(shstrtab, ".note.go.buildid") 1743 } 1744 Addstring(shstrtab, ".elfdata") 1745 Addstring(shstrtab, ".rodata") 1746 // See the comment about data.rel.ro.FOO section names in data.go. 1747 relro_prefix := "" 1748 if UseRelro() { 1749 Addstring(shstrtab, ".data.rel.ro") 1750 relro_prefix = ".data.rel.ro" 1751 } 1752 Addstring(shstrtab, relro_prefix+".typelink") 1753 Addstring(shstrtab, relro_prefix+".gosymtab") 1754 Addstring(shstrtab, relro_prefix+".gopclntab") 1755 1756 if Linkmode == LinkExternal { 1757 Debug['d'] = 1 1758 1759 switch Thearch.Thechar { 1760 case '0', '6', '7', '9': 1761 Addstring(shstrtab, ".rela.text") 1762 Addstring(shstrtab, ".rela.rodata") 1763 Addstring(shstrtab, ".rela"+relro_prefix+".typelink") 1764 Addstring(shstrtab, ".rela"+relro_prefix+".gosymtab") 1765 Addstring(shstrtab, ".rela"+relro_prefix+".gopclntab") 1766 Addstring(shstrtab, ".rela.noptrdata") 1767 Addstring(shstrtab, ".rela.data") 1768 if UseRelro() { 1769 Addstring(shstrtab, ".rela.data.rel.ro") 1770 } 1771 1772 default: 1773 Addstring(shstrtab, ".rel.text") 1774 Addstring(shstrtab, ".rel.rodata") 1775 Addstring(shstrtab, ".rel"+relro_prefix+".typelink") 1776 Addstring(shstrtab, ".rel"+relro_prefix+".gosymtab") 1777 Addstring(shstrtab, ".rel"+relro_prefix+".gopclntab") 1778 Addstring(shstrtab, ".rel.noptrdata") 1779 Addstring(shstrtab, ".rel.data") 1780 if UseRelro() { 1781 Addstring(shstrtab, ".rel.data.rel.ro") 1782 } 1783 } 1784 1785 // add a .note.GNU-stack section to mark the stack as non-executable 1786 Addstring(shstrtab, ".note.GNU-stack") 1787 1788 if Buildmode == BuildmodeShared { 1789 Addstring(shstrtab, ".note.go.abihash") 1790 Addstring(shstrtab, ".note.go.pkg-list") 1791 Addstring(shstrtab, ".note.go.deps") 1792 } 1793 } 1794 1795 hasinitarr := Linkshared 1796 1797 /* shared library initializer */ 1798 switch Buildmode { 1799 case BuildmodeCArchive, BuildmodeCShared, BuildmodeShared: 1800 hasinitarr = true 1801 } 1802 1803 if hasinitarr { 1804 Addstring(shstrtab, ".init_array") 1805 switch Thearch.Thechar { 1806 case '0', '6', '7', '9': 1807 Addstring(shstrtab, ".rela.init_array") 1808 default: 1809 Addstring(shstrtab, ".rel.init_array") 1810 } 1811 } 1812 1813 if Debug['s'] == 0 { 1814 Addstring(shstrtab, ".symtab") 1815 Addstring(shstrtab, ".strtab") 1816 dwarfaddshstrings(shstrtab) 1817 } 1818 1819 Addstring(shstrtab, ".shstrtab") 1820 1821 if Debug['d'] == 0 { /* -d suppresses dynamic loader format */ 1822 Addstring(shstrtab, ".interp") 1823 Addstring(shstrtab, ".hash") 1824 Addstring(shstrtab, ".got") 1825 if Thearch.Thechar == '9' { 1826 Addstring(shstrtab, ".glink") 1827 } 1828 Addstring(shstrtab, ".got.plt") 1829 Addstring(shstrtab, ".dynamic") 1830 Addstring(shstrtab, ".dynsym") 1831 Addstring(shstrtab, ".dynstr") 1832 switch Thearch.Thechar { 1833 case '0', '6', '7', '9': 1834 Addstring(shstrtab, ".rela") 1835 Addstring(shstrtab, ".rela.plt") 1836 default: 1837 Addstring(shstrtab, ".rel") 1838 Addstring(shstrtab, ".rel.plt") 1839 } 1840 1841 Addstring(shstrtab, ".plt") 1842 Addstring(shstrtab, ".gnu.version") 1843 Addstring(shstrtab, ".gnu.version_r") 1844 1845 /* dynamic symbol table - first entry all zeros */ 1846 s := Linklookup(Ctxt, ".dynsym", 0) 1847 1848 s.Type = obj.SELFROSECT 1849 s.Reachable = true 1850 switch Thearch.Thechar { 1851 case '0', '6', '7', '9': 1852 s.Size += ELF64SYMSIZE 1853 default: 1854 s.Size += ELF32SYMSIZE 1855 } 1856 1857 /* dynamic string table */ 1858 s = Linklookup(Ctxt, ".dynstr", 0) 1859 1860 s.Type = obj.SELFROSECT 1861 s.Reachable = true 1862 if s.Size == 0 { 1863 Addstring(s, "") 1864 } 1865 dynstr := s 1866 1867 /* relocation table */ 1868 switch Thearch.Thechar { 1869 case '0', '6', '7', '9': 1870 s = Linklookup(Ctxt, ".rela", 0) 1871 default: 1872 s = Linklookup(Ctxt, ".rel", 0) 1873 } 1874 s.Reachable = true 1875 s.Type = obj.SELFROSECT 1876 1877 /* global offset table */ 1878 s = Linklookup(Ctxt, ".got", 0) 1879 1880 s.Reachable = true 1881 s.Type = obj.SELFGOT // writable 1882 1883 /* ppc64 glink resolver */ 1884 if Thearch.Thechar == '9' { 1885 s := Linklookup(Ctxt, ".glink", 0) 1886 s.Reachable = true 1887 s.Type = obj.SELFRXSECT 1888 } 1889 1890 /* hash */ 1891 s = Linklookup(Ctxt, ".hash", 0) 1892 1893 s.Reachable = true 1894 s.Type = obj.SELFROSECT 1895 1896 s = Linklookup(Ctxt, ".got.plt", 0) 1897 s.Reachable = true 1898 s.Type = obj.SELFSECT // writable 1899 1900 s = Linklookup(Ctxt, ".plt", 0) 1901 1902 s.Reachable = true 1903 if Thearch.Thechar == '9' { 1904 // In the ppc64 ABI, .plt is a data section 1905 // written by the dynamic linker. 1906 s.Type = obj.SELFSECT 1907 } else { 1908 s.Type = obj.SELFRXSECT 1909 } 1910 1911 Thearch.Elfsetupplt() 1912 1913 switch Thearch.Thechar { 1914 case '0', '6', '7', '9': 1915 s = Linklookup(Ctxt, ".rela.plt", 0) 1916 default: 1917 s = Linklookup(Ctxt, ".rel.plt", 0) 1918 } 1919 s.Reachable = true 1920 s.Type = obj.SELFROSECT 1921 1922 s = Linklookup(Ctxt, ".gnu.version", 0) 1923 s.Reachable = true 1924 s.Type = obj.SELFROSECT 1925 1926 s = Linklookup(Ctxt, ".gnu.version_r", 0) 1927 s.Reachable = true 1928 s.Type = obj.SELFROSECT 1929 1930 /* define dynamic elf table */ 1931 s = Linklookup(Ctxt, ".dynamic", 0) 1932 1933 s.Reachable = true 1934 s.Type = obj.SELFSECT // writable 1935 1936 /* 1937 * .dynamic table 1938 */ 1939 elfwritedynentsym(s, DT_HASH, Linklookup(Ctxt, ".hash", 0)) 1940 1941 elfwritedynentsym(s, DT_SYMTAB, Linklookup(Ctxt, ".dynsym", 0)) 1942 switch Thearch.Thechar { 1943 case '0', '6', '7', '9': 1944 Elfwritedynent(s, DT_SYMENT, ELF64SYMSIZE) 1945 default: 1946 Elfwritedynent(s, DT_SYMENT, ELF32SYMSIZE) 1947 } 1948 elfwritedynentsym(s, DT_STRTAB, Linklookup(Ctxt, ".dynstr", 0)) 1949 elfwritedynentsymsize(s, DT_STRSZ, Linklookup(Ctxt, ".dynstr", 0)) 1950 switch Thearch.Thechar { 1951 case '0', '6', '7', '9': 1952 elfwritedynentsym(s, DT_RELA, Linklookup(Ctxt, ".rela", 0)) 1953 elfwritedynentsymsize(s, DT_RELASZ, Linklookup(Ctxt, ".rela", 0)) 1954 Elfwritedynent(s, DT_RELAENT, ELF64RELASIZE) 1955 default: 1956 elfwritedynentsym(s, DT_REL, Linklookup(Ctxt, ".rel", 0)) 1957 elfwritedynentsymsize(s, DT_RELSZ, Linklookup(Ctxt, ".rel", 0)) 1958 Elfwritedynent(s, DT_RELENT, ELF32RELSIZE) 1959 } 1960 1961 if rpath.val != "" { 1962 Elfwritedynent(s, DT_RUNPATH, uint64(Addstring(dynstr, rpath.val))) 1963 } 1964 1965 if Thearch.Thechar == '9' { 1966 elfwritedynentsym(s, DT_PLTGOT, Linklookup(Ctxt, ".plt", 0)) 1967 } else { 1968 elfwritedynentsym(s, DT_PLTGOT, Linklookup(Ctxt, ".got.plt", 0)) 1969 } 1970 1971 if Thearch.Thechar == '9' { 1972 Elfwritedynent(s, DT_PPC64_OPT, 0) 1973 } 1974 1975 // Solaris dynamic linker can't handle an empty .rela.plt if 1976 // DT_JMPREL is emitted so we have to defer generation of DT_PLTREL, 1977 // DT_PLTRELSZ, and DT_JMPREL dynamic entries until after we know the 1978 // size of .rel(a).plt section. 1979 Elfwritedynent(s, DT_DEBUG, 0) 1980 } 1981 1982 if Buildmode == BuildmodeShared { 1983 // The go.link.abihashbytes symbol will be pointed at the appropriate 1984 // part of the .note.go.abihash section in data.go:func address(). 1985 s := Linklookup(Ctxt, "go.link.abihashbytes", 0) 1986 s.Local = true 1987 s.Type = obj.SRODATA 1988 s.Special = 1 1989 s.Reachable = true 1990 s.Size = int64(sha1.Size) 1991 1992 sort.Sort(byPkg(Ctxt.Library)) 1993 h := sha1.New() 1994 for _, l := range Ctxt.Library { 1995 h.Write(l.hash) 1996 } 1997 addgonote(".note.go.abihash", ELF_NOTE_GOABIHASH_TAG, h.Sum([]byte{})) 1998 addgonote(".note.go.pkg-list", ELF_NOTE_GOPKGLIST_TAG, []byte(pkglistfornote)) 1999 var deplist []string 2000 for _, shlib := range Ctxt.Shlibs { 2001 deplist = append(deplist, filepath.Base(shlib.Path)) 2002 } 2003 addgonote(".note.go.deps", ELF_NOTE_GODEPS_TAG, []byte(strings.Join(deplist, "\n"))) 2004 } 2005 2006 if Linkmode == LinkExternal && buildid != "" { 2007 addgonote(".note.go.buildid", ELF_NOTE_GOBUILDID_TAG, []byte(buildid)) 2008 } 2009 } 2010 2011 // Do not write DT_NULL. elfdynhash will finish it. 2012 func shsym(sh *ElfShdr, s *LSym) { 2013 addr := Symaddr(s) 2014 if sh.flags&SHF_ALLOC != 0 { 2015 sh.addr = uint64(addr) 2016 } 2017 sh.off = uint64(datoff(addr)) 2018 sh.size = uint64(s.Size) 2019 } 2020 2021 func phsh(ph *ElfPhdr, sh *ElfShdr) { 2022 ph.vaddr = sh.addr 2023 ph.paddr = ph.vaddr 2024 ph.off = sh.off 2025 ph.filesz = sh.size 2026 ph.memsz = sh.size 2027 ph.align = sh.addralign 2028 } 2029 2030 func Asmbelfsetup() { 2031 /* This null SHdr must appear before all others */ 2032 elfshname("") 2033 2034 for sect := Segtext.Sect; sect != nil; sect = sect.Next { 2035 elfshalloc(sect) 2036 } 2037 for sect := Segrodata.Sect; sect != nil; sect = sect.Next { 2038 elfshalloc(sect) 2039 } 2040 for sect := Segdata.Sect; sect != nil; sect = sect.Next { 2041 elfshalloc(sect) 2042 } 2043 } 2044 2045 func Asmbelf(symo int64) { 2046 eh := getElfEhdr() 2047 switch Thearch.Thechar { 2048 default: 2049 Exitf("unknown architecture in asmbelf: %v", Thearch.Thechar) 2050 case '0': 2051 eh.machine = EM_MIPS 2052 case '5': 2053 eh.machine = EM_ARM 2054 case '6': 2055 eh.machine = EM_X86_64 2056 case '7': 2057 eh.machine = EM_AARCH64 2058 case '8': 2059 eh.machine = EM_386 2060 case '9': 2061 eh.machine = EM_PPC64 2062 } 2063 2064 elfreserve := int64(ELFRESERVE) 2065 startva := INITTEXT - int64(HEADR) 2066 resoff := elfreserve 2067 2068 var pph *ElfPhdr 2069 var pnote *ElfPhdr 2070 if Linkmode == LinkExternal { 2071 /* skip program headers */ 2072 eh.phoff = 0 2073 2074 eh.phentsize = 0 2075 2076 if Buildmode == BuildmodeShared { 2077 sh := elfshname(".note.go.pkg-list") 2078 sh.type_ = SHT_NOTE 2079 sh = elfshname(".note.go.abihash") 2080 sh.type_ = SHT_NOTE 2081 sh.flags = SHF_ALLOC 2082 sh = elfshname(".note.go.deps") 2083 sh.type_ = SHT_NOTE 2084 } 2085 2086 if buildid != "" { 2087 sh := elfshname(".note.go.buildid") 2088 sh.type_ = SHT_NOTE 2089 sh.flags = SHF_ALLOC 2090 } 2091 2092 goto elfobj 2093 } 2094 2095 /* program header info */ 2096 pph = newElfPhdr() 2097 2098 pph.type_ = PT_PHDR 2099 pph.flags = PF_R 2100 pph.off = uint64(eh.ehsize) 2101 pph.vaddr = uint64(INITTEXT) - uint64(HEADR) + pph.off 2102 pph.paddr = uint64(INITTEXT) - uint64(HEADR) + pph.off 2103 pph.align = uint64(INITRND) 2104 2105 /* 2106 * PHDR must be in a loaded segment. Adjust the text 2107 * segment boundaries downwards to include it. 2108 * Except on NaCl where it must not be loaded. 2109 */ 2110 if HEADTYPE != obj.Hnacl { 2111 o := int64(Segtext.Vaddr - pph.vaddr) 2112 Segtext.Vaddr -= uint64(o) 2113 Segtext.Length += uint64(o) 2114 o = int64(Segtext.Fileoff - pph.off) 2115 Segtext.Fileoff -= uint64(o) 2116 Segtext.Filelen += uint64(o) 2117 } 2118 2119 if Debug['d'] == 0 { /* -d suppresses dynamic loader format */ 2120 /* interpreter */ 2121 sh := elfshname(".interp") 2122 2123 sh.type_ = SHT_PROGBITS 2124 sh.flags = SHF_ALLOC 2125 sh.addralign = 1 2126 if interpreter == "" { 2127 switch HEADTYPE { 2128 case obj.Hlinux: 2129 interpreter = Thearch.Linuxdynld 2130 2131 case obj.Hfreebsd: 2132 interpreter = Thearch.Freebsddynld 2133 2134 case obj.Hnetbsd: 2135 interpreter = Thearch.Netbsddynld 2136 2137 case obj.Hopenbsd: 2138 interpreter = Thearch.Openbsddynld 2139 2140 case obj.Hdragonfly: 2141 interpreter = Thearch.Dragonflydynld 2142 2143 case obj.Hsolaris: 2144 interpreter = Thearch.Solarisdynld 2145 } 2146 } 2147 2148 resoff -= int64(elfinterp(sh, uint64(startva), uint64(resoff), interpreter)) 2149 2150 ph := newElfPhdr() 2151 ph.type_ = PT_INTERP 2152 ph.flags = PF_R 2153 phsh(ph, sh) 2154 } 2155 2156 pnote = nil 2157 if HEADTYPE == obj.Hnetbsd || HEADTYPE == obj.Hopenbsd { 2158 var sh *ElfShdr 2159 switch HEADTYPE { 2160 case obj.Hnetbsd: 2161 sh = elfshname(".note.netbsd.ident") 2162 resoff -= int64(elfnetbsdsig(sh, uint64(startva), uint64(resoff))) 2163 2164 case obj.Hopenbsd: 2165 sh = elfshname(".note.openbsd.ident") 2166 resoff -= int64(elfopenbsdsig(sh, uint64(startva), uint64(resoff))) 2167 } 2168 2169 pnote = newElfPhdr() 2170 pnote.type_ = PT_NOTE 2171 pnote.flags = PF_R 2172 phsh(pnote, sh) 2173 } 2174 2175 if len(buildinfo) > 0 { 2176 sh := elfshname(".note.gnu.build-id") 2177 resoff -= int64(elfbuildinfo(sh, uint64(startva), uint64(resoff))) 2178 2179 if pnote == nil { 2180 pnote = newElfPhdr() 2181 pnote.type_ = PT_NOTE 2182 pnote.flags = PF_R 2183 } 2184 2185 phsh(pnote, sh) 2186 } 2187 2188 if buildid != "" { 2189 sh := elfshname(".note.go.buildid") 2190 resoff -= int64(elfgobuildid(sh, uint64(startva), uint64(resoff))) 2191 2192 pnote := newElfPhdr() 2193 pnote.type_ = PT_NOTE 2194 pnote.flags = PF_R 2195 phsh(pnote, sh) 2196 } 2197 2198 // Additions to the reserved area must be above this line. 2199 2200 elfphload(&Segtext) 2201 if Segrodata.Sect != nil { 2202 elfphload(&Segrodata) 2203 } 2204 elfphload(&Segdata) 2205 2206 /* Dynamic linking sections */ 2207 if Debug['d'] == 0 { 2208 sh := elfshname(".dynsym") 2209 sh.type_ = SHT_DYNSYM 2210 sh.flags = SHF_ALLOC 2211 if elf64 { 2212 sh.entsize = ELF64SYMSIZE 2213 } else { 2214 sh.entsize = ELF32SYMSIZE 2215 } 2216 sh.addralign = uint64(Thearch.Regsize) 2217 sh.link = uint32(elfshname(".dynstr").shnum) 2218 2219 // sh->info = index of first non-local symbol (number of local symbols) 2220 shsym(sh, Linklookup(Ctxt, ".dynsym", 0)) 2221 2222 sh = elfshname(".dynstr") 2223 sh.type_ = SHT_STRTAB 2224 sh.flags = SHF_ALLOC 2225 sh.addralign = 1 2226 shsym(sh, Linklookup(Ctxt, ".dynstr", 0)) 2227 2228 if elfverneed != 0 { 2229 sh := elfshname(".gnu.version") 2230 sh.type_ = SHT_GNU_VERSYM 2231 sh.flags = SHF_ALLOC 2232 sh.addralign = 2 2233 sh.link = uint32(elfshname(".dynsym").shnum) 2234 sh.entsize = 2 2235 shsym(sh, Linklookup(Ctxt, ".gnu.version", 0)) 2236 2237 sh = elfshname(".gnu.version_r") 2238 sh.type_ = SHT_GNU_VERNEED 2239 sh.flags = SHF_ALLOC 2240 sh.addralign = uint64(Thearch.Regsize) 2241 sh.info = uint32(elfverneed) 2242 sh.link = uint32(elfshname(".dynstr").shnum) 2243 shsym(sh, Linklookup(Ctxt, ".gnu.version_r", 0)) 2244 } 2245 2246 switch eh.machine { 2247 case EM_X86_64, EM_PPC64, EM_AARCH64: 2248 sh := elfshname(".rela.plt") 2249 sh.type_ = SHT_RELA 2250 sh.flags = SHF_ALLOC 2251 sh.entsize = ELF64RELASIZE 2252 sh.addralign = uint64(Thearch.Regsize) 2253 sh.link = uint32(elfshname(".dynsym").shnum) 2254 sh.info = uint32(elfshname(".plt").shnum) 2255 shsym(sh, Linklookup(Ctxt, ".rela.plt", 0)) 2256 2257 sh = elfshname(".rela") 2258 sh.type_ = SHT_RELA 2259 sh.flags = SHF_ALLOC 2260 sh.entsize = ELF64RELASIZE 2261 sh.addralign = 8 2262 sh.link = uint32(elfshname(".dynsym").shnum) 2263 shsym(sh, Linklookup(Ctxt, ".rela", 0)) 2264 2265 default: 2266 sh := elfshname(".rel.plt") 2267 sh.type_ = SHT_REL 2268 sh.flags = SHF_ALLOC 2269 sh.entsize = ELF32RELSIZE 2270 sh.addralign = 4 2271 sh.link = uint32(elfshname(".dynsym").shnum) 2272 shsym(sh, Linklookup(Ctxt, ".rel.plt", 0)) 2273 2274 sh = elfshname(".rel") 2275 sh.type_ = SHT_REL 2276 sh.flags = SHF_ALLOC 2277 sh.entsize = ELF32RELSIZE 2278 sh.addralign = 4 2279 sh.link = uint32(elfshname(".dynsym").shnum) 2280 shsym(sh, Linklookup(Ctxt, ".rel", 0)) 2281 } 2282 2283 if eh.machine == EM_PPC64 { 2284 sh := elfshname(".glink") 2285 sh.type_ = SHT_PROGBITS 2286 sh.flags = SHF_ALLOC + SHF_EXECINSTR 2287 sh.addralign = 4 2288 shsym(sh, Linklookup(Ctxt, ".glink", 0)) 2289 } 2290 2291 sh = elfshname(".plt") 2292 sh.type_ = SHT_PROGBITS 2293 sh.flags = SHF_ALLOC + SHF_EXECINSTR 2294 if eh.machine == EM_X86_64 { 2295 sh.entsize = 16 2296 } else if eh.machine == EM_PPC64 { 2297 // On ppc64, this is just a table of addresses 2298 // filled by the dynamic linker 2299 sh.type_ = SHT_NOBITS 2300 2301 sh.flags = SHF_ALLOC + SHF_WRITE 2302 sh.entsize = 8 2303 } else { 2304 sh.entsize = 4 2305 } 2306 sh.addralign = sh.entsize 2307 shsym(sh, Linklookup(Ctxt, ".plt", 0)) 2308 2309 // On ppc64, .got comes from the input files, so don't 2310 // create it here, and .got.plt is not used. 2311 if eh.machine != EM_PPC64 { 2312 sh := elfshname(".got") 2313 sh.type_ = SHT_PROGBITS 2314 sh.flags = SHF_ALLOC + SHF_WRITE 2315 sh.entsize = uint64(Thearch.Regsize) 2316 sh.addralign = uint64(Thearch.Regsize) 2317 shsym(sh, Linklookup(Ctxt, ".got", 0)) 2318 2319 sh = elfshname(".got.plt") 2320 sh.type_ = SHT_PROGBITS 2321 sh.flags = SHF_ALLOC + SHF_WRITE 2322 sh.entsize = uint64(Thearch.Regsize) 2323 sh.addralign = uint64(Thearch.Regsize) 2324 shsym(sh, Linklookup(Ctxt, ".got.plt", 0)) 2325 } 2326 2327 sh = elfshname(".hash") 2328 sh.type_ = SHT_HASH 2329 sh.flags = SHF_ALLOC 2330 sh.entsize = 4 2331 sh.addralign = uint64(Thearch.Regsize) 2332 sh.link = uint32(elfshname(".dynsym").shnum) 2333 shsym(sh, Linklookup(Ctxt, ".hash", 0)) 2334 2335 /* sh and PT_DYNAMIC for .dynamic section */ 2336 sh = elfshname(".dynamic") 2337 2338 sh.type_ = SHT_DYNAMIC 2339 sh.flags = SHF_ALLOC + SHF_WRITE 2340 sh.entsize = 2 * uint64(Thearch.Regsize) 2341 sh.addralign = uint64(Thearch.Regsize) 2342 sh.link = uint32(elfshname(".dynstr").shnum) 2343 shsym(sh, Linklookup(Ctxt, ".dynamic", 0)) 2344 ph := newElfPhdr() 2345 ph.type_ = PT_DYNAMIC 2346 ph.flags = PF_R + PF_W 2347 phsh(ph, sh) 2348 2349 /* 2350 * Thread-local storage segment (really just size). 2351 */ 2352 // Do not emit PT_TLS for OpenBSD since ld.so(1) does 2353 // not currently support it. This is handled 2354 // appropriately in runtime/cgo. 2355 if HEADTYPE != obj.Hopenbsd { 2356 tlssize := uint64(0) 2357 for sect := Segdata.Sect; sect != nil; sect = sect.Next { 2358 if sect.Name == ".tbss" { 2359 tlssize = sect.Length 2360 } 2361 } 2362 if tlssize != 0 { 2363 ph := newElfPhdr() 2364 ph.type_ = PT_TLS 2365 ph.flags = PF_R 2366 ph.memsz = tlssize 2367 ph.align = uint64(Thearch.Regsize) 2368 } 2369 } 2370 } 2371 2372 if HEADTYPE == obj.Hlinux { 2373 ph := newElfPhdr() 2374 ph.type_ = PT_GNU_STACK 2375 ph.flags = PF_W + PF_R 2376 ph.align = uint64(Thearch.Regsize) 2377 2378 ph = newElfPhdr() 2379 ph.type_ = PT_PAX_FLAGS 2380 ph.flags = 0x2a00 // mprotect, randexec, emutramp disabled 2381 ph.align = uint64(Thearch.Regsize) 2382 } 2383 2384 elfobj: 2385 sh := elfshname(".shstrtab") 2386 sh.type_ = SHT_STRTAB 2387 sh.addralign = 1 2388 shsym(sh, Linklookup(Ctxt, ".shstrtab", 0)) 2389 eh.shstrndx = uint16(sh.shnum) 2390 2391 // put these sections early in the list 2392 if Debug['s'] == 0 { 2393 elfshname(".symtab") 2394 elfshname(".strtab") 2395 } 2396 2397 for sect := Segtext.Sect; sect != nil; sect = sect.Next { 2398 elfshbits(sect) 2399 } 2400 for sect := Segrodata.Sect; sect != nil; sect = sect.Next { 2401 elfshbits(sect) 2402 } 2403 for sect := Segdata.Sect; sect != nil; sect = sect.Next { 2404 elfshbits(sect) 2405 } 2406 2407 if Linkmode == LinkExternal { 2408 for sect := Segtext.Sect; sect != nil; sect = sect.Next { 2409 elfshreloc(sect) 2410 } 2411 for sect := Segrodata.Sect; sect != nil; sect = sect.Next { 2412 elfshreloc(sect) 2413 } 2414 for sect := Segdata.Sect; sect != nil; sect = sect.Next { 2415 elfshreloc(sect) 2416 } 2417 2418 // add a .note.GNU-stack section to mark the stack as non-executable 2419 sh := elfshname(".note.GNU-stack") 2420 2421 sh.type_ = SHT_PROGBITS 2422 sh.addralign = 1 2423 sh.flags = 0 2424 } 2425 2426 if Debug['s'] == 0 { 2427 sh := elfshname(".symtab") 2428 sh.type_ = SHT_SYMTAB 2429 sh.off = uint64(symo) 2430 sh.size = uint64(Symsize) 2431 sh.addralign = uint64(Thearch.Regsize) 2432 sh.entsize = 8 + 2*uint64(Thearch.Regsize) 2433 sh.link = uint32(elfshname(".strtab").shnum) 2434 sh.info = uint32(elfglobalsymndx) 2435 2436 sh = elfshname(".strtab") 2437 sh.type_ = SHT_STRTAB 2438 sh.off = uint64(symo) + uint64(Symsize) 2439 sh.size = uint64(len(Elfstrdat)) 2440 sh.addralign = 1 2441 2442 dwarfaddelfheaders() 2443 } 2444 2445 /* Main header */ 2446 eh.ident[EI_MAG0] = '\177' 2447 2448 eh.ident[EI_MAG1] = 'E' 2449 eh.ident[EI_MAG2] = 'L' 2450 eh.ident[EI_MAG3] = 'F' 2451 if HEADTYPE == obj.Hfreebsd { 2452 eh.ident[EI_OSABI] = ELFOSABI_FREEBSD 2453 } else if HEADTYPE == obj.Hnetbsd { 2454 eh.ident[EI_OSABI] = ELFOSABI_NETBSD 2455 } else if HEADTYPE == obj.Hopenbsd { 2456 eh.ident[EI_OSABI] = ELFOSABI_OPENBSD 2457 } else if HEADTYPE == obj.Hdragonfly { 2458 eh.ident[EI_OSABI] = ELFOSABI_NONE 2459 } 2460 if elf64 { 2461 eh.ident[EI_CLASS] = ELFCLASS64 2462 } else { 2463 eh.ident[EI_CLASS] = ELFCLASS32 2464 } 2465 if Ctxt.Arch.ByteOrder == binary.BigEndian { 2466 eh.ident[EI_DATA] = ELFDATA2MSB 2467 } else { 2468 eh.ident[EI_DATA] = ELFDATA2LSB 2469 } 2470 eh.ident[EI_VERSION] = EV_CURRENT 2471 2472 if Linkmode == LinkExternal { 2473 eh.type_ = ET_REL 2474 } else { 2475 eh.type_ = ET_EXEC 2476 } 2477 2478 if Linkmode != LinkExternal { 2479 eh.entry = uint64(Entryvalue()) 2480 } 2481 2482 eh.version = EV_CURRENT 2483 2484 if pph != nil { 2485 pph.filesz = uint64(eh.phnum) * uint64(eh.phentsize) 2486 pph.memsz = pph.filesz 2487 } 2488 2489 Cseek(0) 2490 a := int64(0) 2491 a += int64(elfwritehdr()) 2492 a += int64(elfwritephdrs()) 2493 a += int64(elfwriteshdrs()) 2494 if Debug['d'] == 0 { 2495 a += int64(elfwriteinterp()) 2496 } 2497 if Linkmode != LinkExternal { 2498 if HEADTYPE == obj.Hnetbsd { 2499 a += int64(elfwritenetbsdsig()) 2500 } 2501 if HEADTYPE == obj.Hopenbsd { 2502 a += int64(elfwriteopenbsdsig()) 2503 } 2504 if len(buildinfo) > 0 { 2505 a += int64(elfwritebuildinfo()) 2506 } 2507 if buildid != "" { 2508 a += int64(elfwritegobuildid()) 2509 } 2510 } 2511 2512 if a > elfreserve { 2513 Diag("ELFRESERVE too small: %d > %d", a, elfreserve) 2514 } 2515 } 2516 2517 func Elfadddynsym(ctxt *Link, s *LSym) { 2518 if elf64 { 2519 s.Dynid = int32(Nelfsym) 2520 Nelfsym++ 2521 2522 d := Linklookup(ctxt, ".dynsym", 0) 2523 2524 name := s.Extname 2525 Adduint32(ctxt, d, uint32(Addstring(Linklookup(ctxt, ".dynstr", 0), name))) 2526 2527 /* type */ 2528 t := STB_GLOBAL << 4 2529 2530 if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT { 2531 t |= STT_FUNC 2532 } else { 2533 t |= STT_OBJECT 2534 } 2535 Adduint8(ctxt, d, uint8(t)) 2536 2537 /* reserved */ 2538 Adduint8(ctxt, d, 0) 2539 2540 /* section where symbol is defined */ 2541 if s.Type == obj.SDYNIMPORT { 2542 Adduint16(ctxt, d, SHN_UNDEF) 2543 } else { 2544 Adduint16(ctxt, d, 1) 2545 } 2546 2547 /* value */ 2548 if s.Type == obj.SDYNIMPORT { 2549 Adduint64(ctxt, d, 0) 2550 } else { 2551 Addaddr(ctxt, d, s) 2552 } 2553 2554 /* size of object */ 2555 Adduint64(ctxt, d, uint64(s.Size)) 2556 2557 if Thearch.Thechar == '6' && s.Cgoexport&CgoExportDynamic == 0 && s.Dynimplib != "" && !seenlib[s.Dynimplib] { 2558 Elfwritedynent(Linklookup(ctxt, ".dynamic", 0), DT_NEEDED, uint64(Addstring(Linklookup(ctxt, ".dynstr", 0), s.Dynimplib))) 2559 } 2560 } else { 2561 s.Dynid = int32(Nelfsym) 2562 Nelfsym++ 2563 2564 d := Linklookup(ctxt, ".dynsym", 0) 2565 2566 /* name */ 2567 name := s.Extname 2568 2569 Adduint32(ctxt, d, uint32(Addstring(Linklookup(ctxt, ".dynstr", 0), name))) 2570 2571 /* value */ 2572 if s.Type == obj.SDYNIMPORT { 2573 Adduint32(ctxt, d, 0) 2574 } else { 2575 Addaddr(ctxt, d, s) 2576 } 2577 2578 /* size */ 2579 Adduint32(ctxt, d, 0) 2580 2581 /* type */ 2582 t := STB_GLOBAL << 4 2583 2584 // TODO(mwhudson): presumably the behaviour should actually be the same on both arm and 386. 2585 if Thearch.Thechar == '8' && s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT { 2586 t |= STT_FUNC 2587 } else if Thearch.Thechar == '5' && s.Cgoexport&CgoExportDynamic != 0 && s.Type&obj.SMASK == obj.STEXT { 2588 t |= STT_FUNC 2589 } else { 2590 t |= STT_OBJECT 2591 } 2592 Adduint8(ctxt, d, uint8(t)) 2593 Adduint8(ctxt, d, 0) 2594 2595 /* shndx */ 2596 if s.Type == obj.SDYNIMPORT { 2597 Adduint16(ctxt, d, SHN_UNDEF) 2598 } else { 2599 Adduint16(ctxt, d, 1) 2600 } 2601 } 2602 } 2603 2604 func ELF32_R_SYM(info uint32) uint32 { 2605 return info >> 8 2606 } 2607 2608 func ELF32_R_TYPE(info uint32) uint32 { 2609 return uint32(uint8(info)) 2610 } 2611 2612 func ELF32_R_INFO(sym uint32, type_ uint32) uint32 { 2613 return sym<<8 | type_ 2614 } 2615 2616 func ELF32_ST_BIND(info uint8) uint8 { 2617 return info >> 4 2618 } 2619 2620 func ELF32_ST_TYPE(info uint8) uint8 { 2621 return info & 0xf 2622 } 2623 2624 func ELF32_ST_INFO(bind uint8, type_ uint8) uint8 { 2625 return bind<<4 | type_&0xf 2626 } 2627 2628 func ELF32_ST_VISIBILITY(oth uint8) uint8 { 2629 return oth & 3 2630 } 2631 2632 func ELF64_R_SYM(info uint64) uint32 { 2633 return uint32(info >> 32) 2634 } 2635 2636 func ELF64_R_TYPE(info uint64) uint32 { 2637 return uint32(info) 2638 } 2639 2640 func ELF64_R_INFO(sym uint32, type_ uint32) uint64 { 2641 return uint64(sym)<<32 | uint64(type_) 2642 } 2643 2644 func ELF64_ST_BIND(info uint8) uint8 { 2645 return info >> 4 2646 } 2647 2648 func ELF64_ST_TYPE(info uint8) uint8 { 2649 return info & 0xf 2650 } 2651 2652 func ELF64_ST_INFO(bind uint8, type_ uint8) uint8 { 2653 return bind<<4 | type_&0xf 2654 } 2655 2656 func ELF64_ST_VISIBILITY(oth uint8) uint8 { 2657 return oth & 3 2658 }