_libld.h revision 6206:6b0ed502a8e7
1216115Slstewart/* 2216115Slstewart * CDDL HEADER START 3216115Slstewart * 4216115Slstewart * The contents of this file are subject to the terms of the 5216115Slstewart * Common Development and Distribution License (the "License"). 6216115Slstewart * You may not use this file except in compliance with the License. 7216115Slstewart * 8216115Slstewart * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9220560Slstewart * or http://www.opensolaris.org/os/licensing. 10220560Slstewart * See the License for the specific language governing permissions 11220560Slstewart * and limitations under the License. 12216115Slstewart * 13216115Slstewart * When distributing Covered Code, include this CDDL HEADER in each 14216115Slstewart * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15216115Slstewart * If applicable, add the following below this CDDL HEADER, with the 16216115Slstewart * fields enclosed by brackets "[]" replaced with your own identifying 17216115Slstewart * information: Portions Copyright [yyyy] [name of copyright owner] 18216115Slstewart * 19216115Slstewart * CDDL HEADER END 20216115Slstewart */ 21216115Slstewart 22216115Slstewart/* 23216115Slstewart * Copyright (c) 1988 AT&T 24216115Slstewart * All Rights Reserved 25216115Slstewart * 26216115Slstewart * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 27216115Slstewart * Use is subject to license terms. 28216115Slstewart */ 29216115Slstewart 30216115Slstewart/* 31216115Slstewart * Local include file for ld library. 32216115Slstewart */ 33216115Slstewart 34216115Slstewart#ifndef _LIBLD_DOT_H 35216115Slstewart#define _LIBLD_DOT_H 36216115Slstewart 37216115Slstewart#pragma ident "%Z%%M% %I% %E% SMI" 38216115Slstewart 39216115Slstewart#include <libld.h> 40216115Slstewart#include <_libelf.h> 41216115Slstewart#include <debug.h> 42216115Slstewart#include <conv.h> 43220560Slstewart#include <msg.h> 44220560Slstewart#include <reloc_defs.h> 45220560Slstewart 46220560Slstewart#ifdef __cplusplus 47216115Slstewartextern "C" { 48216115Slstewart#endif 49216115Slstewart 50216115Slstewart/* 51216115Slstewart * In order to allow for cross linking, we need to be able to build 52216115Slstewart * libld with support for multiple targets within a single object. 53216115Slstewart * This is done using a global variable (ld_targ) of type Target to 54216115Slstewart * access target-specific code for the current target via indirection. 55216115Slstewart */ 56216115Slstewart 57216115Slstewart/* 58216115Slstewart * Machine information for target 59216115Slstewart */ 60216115Slstewarttypedef struct { 61216115Slstewart Half m_mach; /* ELF machine code for target */ 62216115Slstewart Half m_machplus; /* Alt ELF machine code for target */ 63216115Slstewart /* Used for EM_SPARC32PLUS */ 64216115Slstewart Word m_flagsplus; /* ELF header flags used to identify */ 65216115Slstewart /* a machplus object */ 66216115Slstewart uchar_t m_class; /* Target ELFCLASS */ 67216115Slstewart uchar_t m_data; /* Target byte order */ 68216115Slstewart 69216115Slstewart Xword m_segm_align; /* segment alignment */ 70216115Slstewart Xword m_segm_origin; /* Default 1st segment offset */ 71216115Slstewart Word m_dataseg_perm; /* data segment permission mask */ 72216115Slstewart Word m_word_align; /* alignment to use for Word sections */ 73216115Slstewart const char *m_def_interp; /* Def. interpreter for dyn objects */ 74216115Slstewart 75216115Slstewart /* Relocation type codes */ 76216115Slstewart Word m_r_arrayaddr; 77216115Slstewart Word m_r_copy; 78216115Slstewart Word m_r_glob_dat; 79216115Slstewart Word m_r_jmp_slot; 80216115Slstewart Word m_r_num; 81216115Slstewart Word m_r_none; 82216115Slstewart Word m_r_relative; 83216115Slstewart Word m_r_register; 84216115Slstewart 85216115Slstewart /* Relocation related constants */ 86216115Slstewart Word m_rel_dt_count; /* Either DT_REL or DT_RELA */ 87216115Slstewart Word m_rel_dt_ent; /* Either DT_RELENT or DT_RELAENT */ 88216115Slstewart Word m_rel_dt_size; /* Either DT_RELSZ or DT_RELASZ */ 89216115Slstewart Word m_rel_dt_type; /* Either DT_RELCOUNT or DT_RELACOUNT */ 90216115Slstewart Word m_rel_sht_type; /* Either SHT_REL or SHT_RELA */ 91216115Slstewart 92216115Slstewart /* GOT related constants */ 93216115Slstewart Word m_got_entsize; 94216115Slstewart Word m_got_xnumber; /* reserved # of got ents */ 95216115Slstewart 96216115Slstewart /* PLT related constants */ 97216115Slstewart Word m_plt_align; 98216115Slstewart Word m_plt_entsize; 99216115Slstewart Word m_plt_reservsz; 100216115Slstewart Word m_plt_shf_flags; 101216115Slstewart 102216115Slstewart Word m_dt_register; 103216115Slstewart} Target_mach; 104216115Slstewart 105216115Slstewart 106216115Slstewart/* 107216115Slstewart * Section identifiers, used to order sections in output object 108216115Slstewart */ 109216115Slstewarttypedef struct { 110216115Slstewart Word id_array; 111216115Slstewart Word id_bss; 112216115Slstewart Word id_cap; 113216115Slstewart Word id_data; 114216115Slstewart Word id_dynamic; 115216115Slstewart Word id_dynsort; 116216115Slstewart Word id_dynstr; 117216115Slstewart Word id_dynsym; 118216115Slstewart Word id_dynsym_ndx; 119216115Slstewart Word id_got; 120216115Slstewart Word id_gotdata; 121216115Slstewart Word id_hash; 122216115Slstewart Word id_interp; 123216115Slstewart Word id_lbss; 124216115Slstewart Word id_ldynsym; 125216115Slstewart Word id_note; 126216115Slstewart Word id_null; 127216115Slstewart Word id_plt; 128216115Slstewart Word id_rel; 129216115Slstewart Word id_strtab; 130216115Slstewart Word id_syminfo; 131216115Slstewart Word id_symtab; 132216115Slstewart Word id_symtab_ndx; 133216115Slstewart Word id_text; 134216115Slstewart Word id_tls; 135216115Slstewart Word id_tlsbss; 136216115Slstewart Word id_unknown; 137216115Slstewart Word id_unwind; 138216115Slstewart Word id_user; 139216115Slstewart Word id_version; 140216115Slstewart} Target_machid; 141216115Slstewart 142216115Slstewart/* 143216115Slstewart * Target_nullfunc supplies machine code for generating a 144216115Slstewart * 145216115Slstewart * void (*)(void) 146216115Slstewart * 147216115Slstewart * unnamed function. Such a function can be called, and returns 148216115Slstewart * immediately without doing any work. This is used to back FUNC 149216115Slstewart * symbol definitions added with a mapfile. 150216115Slstewart * 151216115Slstewart * The machine instructions are specified as an array of bytes rather 152216115Slstewart * than a larger integer type in order to avoid byte order issues that 153216115Slstewart * can otherwise occur in cross linking. 154216115Slstewart */ 155216115Slstewarttypedef struct { 156216115Slstewart const uchar_t *nf_template; /* Array of machine inst. bytes */ 157216115Slstewart size_t nf_size; /* # bytes in nf_template */ 158216115Slstewart} Target_nullfunc; 159216115Slstewart 160216115Slstewart/* 161216115Slstewart * Target_machrel holds pointers to the reloc_table and machrel functions 162216115Slstewart * for a given target machine. 163216115Slstewart * 164216115Slstewart * The following function pointers are allowed to be NULL, if the 165216115Slstewart * underlying target does not require the specified operation. All 166216115Slstewart * other functions must be supplied: 167216115Slstewart * 168216115Slstewart * mr_assign_got 169216115Slstewart * mr_reloc_register 170216115Slstewart * mr_reloc_GOTOP 171217322Smdf * mr_allocate_got 172217322Smdf */ 173216115Slstewarttypedef struct { 174216115Slstewart const Rel_entry *mr_reloc_table; 175216115Slstewart 176220592Spluknet Word (* mr_init_rel)(Rel_desc *, void *); 177216115Slstewart void (* mr_mach_eflags)(Ehdr *, Ofl_desc *); 178216115Slstewart void (* mr_mach_make_dynamic)(Ofl_desc *, size_t *); 179216115Slstewart void (* mr_mach_update_odynamic)(Ofl_desc *, Dyn **); 180216115Slstewart Xword (* mr_calc_plt_addr)(Sym_desc *, Ofl_desc *); 181216115Slstewart uintptr_t (* mr_perform_outreloc)(Rel_desc *, Ofl_desc *); 182216115Slstewart uintptr_t (* mr_do_activerelocs)(Ofl_desc *); 183216115Slstewart uintptr_t (* mr_add_outrel)(Word, Rel_desc *, Ofl_desc *); 184216115Slstewart uintptr_t (* mr_reloc_register)(Rel_desc *, Is_desc *, 185216115Slstewart Ofl_desc *); 186216115Slstewart uintptr_t (* mr_reloc_local)(Rel_desc *, Ofl_desc *); 187216115Slstewart uintptr_t (* mr_reloc_GOTOP)(Boolean, Rel_desc *, Ofl_desc *); 188216115Slstewart uintptr_t (* mr_reloc_TLS)(Boolean, Rel_desc *, Ofl_desc *); 189216115Slstewart uintptr_t (* mr_assign_got)(Ofl_desc *, Sym_desc *); 190216115Slstewart 191216115Slstewart Gotndx * (* mr_find_gotndx)(List *, Gotref, Ofl_desc *, 192216115Slstewart Rel_desc *); 193216115Slstewart Xword (* mr_calc_got_offset)(Rel_desc *, Ofl_desc *); 194216115Slstewart uintptr_t (* mr_assign_got_ndx)(List *, Gotndx *, Gotref, 195216115Slstewart Ofl_desc *, Rel_desc *, Sym_desc *); 196216115Slstewart void (* mr_assign_plt_ndx)(Sym_desc *, Ofl_desc *); 197216115Slstewart uintptr_t (* mr_allocate_got)(Ofl_desc *); 198216115Slstewart uintptr_t (* mr_fillin_gotplt)(Ofl_desc *); 199216115Slstewart} Target_machrel; 200216115Slstewart 201216115Slstewart 202216115Slstewart/* 203216115Slstewart * Target_machsym holds pointers to the machsym functions 204216115Slstewart * for a given target machine. 205216115Slstewart * 206216115Slstewart * These fields are allowed to be NULL for targets that do not require 207216115Slstewart * special handling of register symbols. Register symbols are used by 208216115Slstewart * sparc targets. If any of these fields are non-NULL, all of them are 209216115Slstewart * required to be present (use empty stub routines if necessary). 210216115Slstewart */ 211216115Slstewarttypedef struct { 212216115Slstewart int (* ms_reg_check)(Sym_desc *, Sym *, const char *, 213216115Slstewart Ifl_desc *, Ofl_desc *); 214216115Slstewart int (* ms_mach_sym_typecheck)(Sym_desc *, Sym *, 215216115Slstewart Ifl_desc *, Ofl_desc *); 216216115Slstewart const char *(* ms_is_regsym)(Ofl_desc *, Ifl_desc *, Sym *, 217216115Slstewart const char *, int, Word, const char *, Word *); 218216115Slstewart Sym_desc *(* ms_reg_find)(Sym * sym, Ofl_desc * ofl); 219216115Slstewart int (* ms_reg_enter)(Sym_desc *, Ofl_desc *); 220216115Slstewart} Target_machsym; 221216115Slstewart 222216115Slstewart/* 223216115Slstewart * amd64 unwind header support 224216115Slstewart * 225216115Slstewart * These fields are allowed to be NULL for targets that do not support 226216115Slstewart * amd64 unwind headers. If any of these fields are non-NULL, all of them are 227216115Slstewart * required to be present (use empty stub routines if necessary). 228216115Slstewart */ 229216115Slstewarttypedef struct { 230216115Slstewart uintptr_t (* uw_make_unwindhdr)(Ofl_desc *); 231216115Slstewart uintptr_t (* uw_populate_unwindhdr)(Ofl_desc *); 232216115Slstewart uintptr_t (* uw_append_unwind)(Os_desc *, Ofl_desc *); 233216115Slstewart} Target_unwind; 234216115Slstewart 235216115Slstewarttypedef struct { 236216115Slstewart Target_mach t_m; 237216115Slstewart Target_machid t_id; 238216115Slstewart Target_nullfunc t_nf; 239216115Slstewart Target_machrel t_mr; 240216115Slstewart Target_machsym t_ms; 241216115Slstewart Target_unwind t_uw; 242216115Slstewart} Target; 243216115Slstewart 244216115Slstewart 245216115Slstewart/* 246216115Slstewart * Types of bss sections 247216115Slstewart */ 248216115Slstewarttypedef enum { 249216115Slstewart MAKE_BSS, 250216115Slstewart MAKE_LBSS, 251216115Slstewart MAKE_TLS 252216115Slstewart} Bss_Type; 253216115Slstewart 254216115Slstewart/* 255216115Slstewart * Structure to manage the update of weak symbols from their associated alias. 256216115Slstewart */ 257216115Slstewarttypedef struct wk_desc { 258216115Slstewart Sym *wk_symtab; /* the .symtab entry */ 259216115Slstewart Sym *wk_dynsym; /* the .dynsym entry */ 260216115Slstewart Sym_desc *wk_weak; /* the original weak symbol */ 261216115Slstewart Sym_desc *wk_alias; /* the real symbol */ 262216115Slstewart} Wk_desc; 263216115Slstewart 264216115Slstewart/* 265216115Slstewart * Structure to manage the support library interfaces. 266216115Slstewart */ 267216115Slstewarttypedef struct func_list { 268216115Slstewart const char *fl_obj; /* name of support object */ 269216115Slstewart /* function is from */ 270216115Slstewart void (*fl_fptr)(); /* function pointer */ 271216115Slstewart uint_t fl_version; /* ld_version() level */ 272216115Slstewart} Func_list; 273216115Slstewart 274216115Slstewarttypedef struct support_list { 275216115Slstewart const char *sup_name; /* ld_support function name */ 276216115Slstewart List sup_funcs; /* list of support functions */ 277216115Slstewart} Support_list; 278216115Slstewart 279216115Slstewart/* 280216115Slstewart * Structure to manage a sorted output relocation list. 281216115Slstewart * 282216115Slstewart * rl_key1 -> pointer to needed ndx 283216115Slstewart * rl_key2 -> pointer to symbol relocation is against 284216115Slstewart * rl_key3 -> virtual offset of relocation 285216115Slstewart */ 286216115Slstewarttypedef struct reloc_list { 287216115Slstewart Sym_desc *rl_key2; 288216115Slstewart Xword rl_key3; 289216115Slstewart Rel_desc *rl_rsp; 290216115Slstewart Half rl_key1; 291216115Slstewart} Reloc_list; 292216115Slstewart 293216115Slstewart 294216115Slstewarttypedef struct sym_s_list { 295216115Slstewart Word sl_hval; 296216115Slstewart Sym_desc * sl_sdp; 297216115Slstewart} Sym_s_list; 298216115Slstewart 299216115Slstewart/* 300216115Slstewart * ld heap management structure 301216115Slstewart */ 302216115Slstewarttypedef struct _ld_heap Ld_heap; 303216115Slstewartstruct _ld_heap { 304216115Slstewart Ld_heap *lh_next; 305216115Slstewart void *lh_free; 306216115Slstewart void *lh_end; 307216115Slstewart}; 308216115Slstewart 309216115Slstewart#define HEAPBLOCK 0x68000 /* default allocation block size */ 310216115Slstewart#define HEAPALIGN 0x8 /* heap blocks alignment requirement */ 311216115Slstewart 312216115Slstewart/* 313216115Slstewart * Dynamic per-symbol filtee string table descriptor. This associates filtee 314216115Slstewart * strings that will be created in the .dynstr, with .dynamic entries. 315216115Slstewart */ 316216115Slstewarttypedef struct { 317216115Slstewart char *dft_str; /* dynstr string */ 318216115Slstewart Word dft_flag; /* auxiliary/filtee type */ 319216115Slstewart Half dft_ndx; /* eventual ndx into .dynamic */ 320216115Slstewart} Dfltr_desc; 321216115Slstewart 322216115Slstewart/* 323216115Slstewart * Per-symbol filtee descriptor. This associates symbol definitions with 324216115Slstewart * their filtees. 325216115Slstewart */ 326216115Slstewarttypedef struct { 327216115Slstewart Sym_desc *sft_sdp; /* symbol descriptor */ 328216115Slstewart Aliste sft_idx; /* index into dtstr descriptor */ 329216115Slstewart} Sfltr_desc; 330216115Slstewart 331216115Slstewart/* 332216115Slstewart * Define Alist initialization sizes. 333216115Slstewart */ 334216115Slstewart#define AL_CNT_IFL_GROUPS 20 /* ifl_groups initial alist count */ 335216115Slstewart#define AL_CNT_OFL_DTSFLTRS 4 /* ofl_dtsfltrs initial alist count */ 336216115Slstewart#define AL_CNT_OFL_SYMFLTRS 20 /* ofl_symfltrs initial alist count */ 337216115Slstewart#define AL_CNT_OS_MSTRISDESCS 10 /* os_mstrisdescs */ 338216115Slstewart#define AL_CNT_SG_OSDESC 40 /* sg_osdescs initial alist count */ 339216115Slstewart#define AL_CNT_SG_SECORDER 40 /* sg_secorder initial alist count */ 340216115Slstewart#define AL_CNT_STRMRGREL 500 /* ld_make_strmerge() reloc alist cnt */ 341216115Slstewart#define AL_CNT_STRMRGSYM 20 /* ld_make_strmerge() sym alist cnt */ 342216115Slstewart 343216115Slstewart/* 344216115Slstewart * Return codes for {tls|got}_fixups() routines 345216115Slstewart */ 346216115Slstewarttypedef enum { 347216115Slstewart FIX_ERROR, /* fatal error - time to punt */ 348216115Slstewart FIX_DONE, /* relocation done - no further processing required */ 349216115Slstewart FIX_RELOC /* do_reloc() relocation processing required */ 350216115Slstewart} Fixupret; 351216115Slstewart 352216115Slstewart#ifndef FILENAME_MAX 353216115Slstewart#define FILENAME_MAX BUFSIZ /* maximum length of a path name */ 354216115Slstewart#endif 355216115Slstewart 356216115Slstewart/* 357216115Slstewart * We pad the end of the .dynstr section with a block of DYNSTR_EXTRA_PAD 358216115Slstewart * bytes, and we insert DYNAMIC_EXTRA_ELTS unused items into the 359216115Slstewart * .dynamic section (with value DT_NULL). This provides the resources needed 360216115Slstewart * to add and/or alter string items in the .dynamic section, such as runpath. 361216115Slstewart */ 362216115Slstewart#define DYNSTR_EXTRA_PAD 512 363216115Slstewart#define DYNAMIC_EXTRA_ELTS 10 364216115Slstewart 365216115Slstewart/* 366216115Slstewart * Relocation buckets are sized based on the number of input relocations and 367216115Slstewart * the following constants. 368216115Slstewart */ 369216115Slstewart#define REL_HAIDESCNO 1000 /* high water mark active buckets */ 370216115Slstewart#define REL_LAIDESCNO 50 /* low water mark active buckets */ 371216115Slstewart#define REL_HOIDESCNO 500 /* high water mark output buckets */ 372216115Slstewart#define REL_LOIDESCNO 10 /* low water mark output buckets */ 373216115Slstewart 374216115Slstewartextern char *Plibpath; 375216115Slstewartextern char *Llibdir; 376216115Slstewartextern char *Ulibdir; 377216115Slstewartextern Ld_heap *ld_heap; 378216115Slstewartextern List lib_support; 379216115Slstewartextern int demangle_flag; 380216115Slstewartextern const Msg reject[]; 381216115Slstewartextern int Verbose; 382216115Slstewartextern const int ldynsym_symtype[STT_NUM]; 383216115Slstewartextern const int dynsymsort_symtype[STT_NUM]; 384216115Slstewart 385216115Slstewart 386216115Slstewart/* 387216115Slstewart * Given a symbol of a type that is allowed within a .SUNW_dynsymsort or 388216115Slstewart * .SUNW_dyntlssort section, examine the symbol attributes to determine 389216115Slstewart * if this particular symbol should be included or not. 390216115Slstewart * 391216115Slstewart * entry: 392216115Slstewart * The symbol must have an allowed type: Either a type verified by 393216115Slstewart * dynsymsort_symtype[] or STT_TLS. 394216115Slstewart * 395216115Slstewart * _sdp - Pointer to symbol descriptor 396216115Slstewart * _sym - Pointer to symbol referenced by _sdp. 397216115Slstewart * 398216115Slstewart * _sym is derivable from _sdp: _sdp->sd_sym 399216115Slstewart * However, most callers assign it to a local variable for efficiency, 400216115Slstewart * and this macro allows such a variable to be used within. If you 401216115Slstewart * don't have such a variable, supply _sdp->sd_sym. 402216115Slstewart * 403216115Slstewart * The tests used require some explanation: 404216115Slstewart * 405216115Slstewart * (_sdp->sd_flags & FLG_SY_DYNSORT) 406216115Slstewart * Some special symbols are kept even if they don't meet the 407216115Slstewart * usual requirements. These symbols have the FLG_SY_DYNSORT 408216115Slstewart * bit set. If this bit isn't set then we look at the other 409216115Slstewart * attributes. 410216115Slstewart * 411216115Slstewart * ((_sdp->sd_ref != REF_DYN_NEED) || (_sdp->sd_flags & FLG_SY_MVTOCOMM)) 412216115Slstewart * We do not want to include symbols that are not defined within 413216115Slstewart * the object we are creating. REF_DYN_NEED corresponds to those 414216115Slstewart * UNDEF items. However, if the symbol is the target of a copy 415216115Slstewart * relocation, then it effectively becomes defined within the 416216115Slstewart * object after all. FLG_SY_MVTOCOMM indicates a copy relocation, 417216115Slstewart * and prevents us from culling those exceptions. 418216115Slstewart * 419216115Slstewart * (_sym->st_size != 0) 420216115Slstewart * Symbols with 0 length are labels injected by the compilers 421216115Slstewart * or the linker for purposes of code generation, and do 422216115Slstewart * not directly correspond to actual code. In fact, most of the 423216115Slstewart * symbols we mark with FLG_SY_DYNSORT need that flag set because 424216115Slstewart * they have size 0. This size test filters out the others. 425216115Slstewart * 426216115Slstewart * !(_sdp->sd_flags & FLG_SY_NODYNSORT) 427216115Slstewart * Some symbols are not kept, even though they do meet the usual 428216115Slstewart * requirements. These symbols have FLG_SY_NODYNSORT set. 429216115Slstewart * For example, if there are weak and non-weak versions of a given 430216115Slstewart * symbol, we only want to keep one of them. So, we set 431216115Slstewart * FLG_SY_NODYNSORT on the one we don't want. 432216115Slstewart */ 433216115Slstewart#define DYNSORT_TEST_ATTR(_sdp, _sym) \ 434216115Slstewart ((_sdp->sd_flags & FLG_SY_DYNSORT) || \ 435216115Slstewart (((_sdp->sd_ref != REF_DYN_NEED) || \ 436216115Slstewart (_sdp->sd_flags & FLG_SY_MVTOCOMM)) && \ 437216115Slstewart (_sym->st_size != 0) && \ 438216115Slstewart !(_sdp->sd_flags & FLG_SY_NODYNSORT))) 439216115Slstewart 440216115Slstewart/* 441216115Slstewart * We use output section descriptor counters to add up the number of 442216115Slstewart * symbol indexes to put in the .SUNW_dynsort and .SUNW_dyntlssort sections. 443216115Slstewart * Non-TLS symbols are counted by ofl->ofl_dynsymsortcnt, while TLS symbols are 444216115Slstewart * counted by ofl->ofl_dyntlssortcnt. This computation is done inline in 445216115Slstewart * several places. The DYNSORT_COUNT macro allows us to generate this from 446216115Slstewart * a single description. 447216115Slstewart * 448216115Slstewart * entry: 449216115Slstewart * _sdp, _sym - As per DYNSORT_TEST_ATTR 450216115Slstewart * _type - Type of symbol (STT_*) 451216115Slstewart * _inc_or_dec_op - Either ++, or --. This specifies the operation 452216115Slstewart * to be applied to the counter, and determines whether we 453216115Slstewart * are adding, or removing, a symbol from .SUNW_dynsymsort. 454216115Slstewart * 455216115Slstewart * Note that _type is derivable from _sym: ELF_ST_TYPE(_sdp->sd_sym->st_info). 456216115Slstewart * Most callers already have it in a variable, so this allows us to use that 457216115Slstewart * variable. If you don't have such a variable, use ELF_ST_TYPE() as shown. 458216115Slstewart */ 459216115Slstewart#define DYNSORT_COUNT(_sdp, _sym, _type, _inc_or_dec_op) \ 460216115Slstewart{ \ 461216115Slstewart Word *_cnt_var; \ 462216115Slstewart \ 463216115Slstewart if (dynsymsort_symtype[_type]) { /* Non-TLS counter */ \ 464216115Slstewart _cnt_var = &ofl->ofl_dynsymsortcnt; \ 465216115Slstewart } else if ((_type) == STT_TLS) { /* TLS counter */ \ 466216115Slstewart _cnt_var = &ofl->ofl_dyntlssortcnt; \ 467216115Slstewart } else { /* Don't count this symbol */ \ 468216115Slstewart _cnt_var = NULL; \ 469216115Slstewart } \ 470216115Slstewart if ((_cnt_var != NULL) && DYNSORT_TEST_ATTR(_sdp, _sym)) \ 471216115Slstewart (*_cnt_var)_inc_or_dec_op; /* Increment/Decrement */ \ 472216115Slstewart} 473216115Slstewart 474216115Slstewart 475216115Slstewart/* 476216115Slstewart * The OFL_SWAP_RELOC macros are used to determine whether 477216115Slstewart * relocation processing needs to swap the data being relocated. 478216115Slstewart * It is an optimization to ld_swap_reloc_data(), as it avoids 479216115Slstewart * the function call in the case where the linker host and the 480216115Slstewart * target have the same byte order. 481216115Slstewart */ 482216115Slstewart 483216115Slstewart#define OFL_SWAP_RELOC_DATA(_ofl, _rel) \ 484216115Slstewart (((_ofl)->ofl_flags1 & FLG_OF1_ENCDIFF) && \ 485216115Slstewart ld_swap_reloc_data(_ofl, _rel)) 486216115Slstewart 487216115Slstewart/* 488216115Slstewart * For backward compatibility provide a /dev/zero file descriptor. 489216115Slstewart */ 490216115Slstewartextern int dz_fd; 491216115Slstewart 492216115Slstewart/* 493216115Slstewart * Local functions. 494216115Slstewart */ 495216115Slstewartextern char *add_string(char *, char *); 496216115Slstewartextern const char *demangle(const char *); 497216115Slstewart 498216115Slstewartextern void lds_atexit(Ofl_desc *, int); 499216115Slstewart 500216115Slstewartextern void libld_free(void *); 501216115Slstewartextern void *libld_malloc(size_t); 502216115Slstewartextern void *libld_realloc(void *, size_t); 503216115Slstewart 504216115Slstewartextern Listnode *list_appendc(List *, const void *); 505216115Slstewartextern Listnode *list_insertc(List *, const void *, Listnode *); 506216115Slstewartextern Listnode *list_prependc(List *, const void *); 507216115Slstewartextern Listnode *list_where(List *, Word num); 508216115Slstewart 509216115Slstewartextern Sdf_desc *sdf_add(const char *, List *); 510216115Slstewartextern Sdf_desc *sdf_find(const char *, List *); 511216115Slstewart 512216115Slstewart#if defined(_ELF64) 513216115Slstewart 514216115Slstewart#define ld_add_actrel ld64_add_actrel 515216115Slstewart#define ld_add_libdir ld64_add_libdir 516216115Slstewart#define ld_adj_movereloc ld64_adj_movereloc 517216115Slstewart#define ld_am_I_partial ld64_am_I_partial 518216115Slstewart#define ld_append_isp ld64_append_isp 519216115Slstewart#define ld_ar_member ld64_ar_member 520216115Slstewart#define ld_ar_setup ld64_ar_setup 521#define ld_assign_got_TLS ld64_assign_got_TLS 522#define ld_bswap_Word ld64_bswap_Word 523#define ld_bswap_Xword ld64_bswap_Xword 524#define ld_disp_errmsg ld64_disp_errmsg 525#define ld_ent_check ld64_ent_check 526#define ld_exit ld64_exit 527#define ld_find_library ld64_find_library 528#define ld_finish_libs ld64_finish_libs 529#define ld_get_group ld64_get_group 530#define ld_lib_setup ld64_lib_setup 531#define ld_init ld64_init 532#define ld_lcm ld64_lcm 533#define ld_make_bss ld64_make_bss 534#define ld_make_data ld64_make_data 535#define ld_make_got ld64_make_got 536#define ld_make_sunwbss ld64_make_sunwbss 537#define ld_make_sunwdata ld64_make_sunwdata 538#define ld_make_sunwmove ld64_make_sunmove 539#define ld_make_text ld64_make_text 540#define ld_map_out ld64_map_out 541#define ld_map_parse ld64_map_parse 542#define ld_open_outfile ld64_open_outfile 543#define ld_place_section ld64_place_section 544#define ld_process_archive ld64_process_archive 545#define ld_process_files ld64_process_files 546#define ld_process_flags ld64_process_flags 547#define ld_process_ifl ld64_process_ifl 548#define ld_process_ordered ld64_process_ordered 549#define ld_process_sym_reloc ld64_process_sym_reloc 550#define ld_reloc_GOT_relative ld64_reloc_GOT_relative 551#define ld_reloc_plt ld64_reloc_plt 552#define ld_reloc_remain_entry ld64_reloc_remain_entry 553#define ld_reloc_targval_get ld64_reloc_targval_get 554#define ld_reloc_targval_set ld64_reloc_targval_set 555#define ld_sec_validate ld64_sec_validate 556#define ld_section_reld_name ld64_section_reld_name 557#define ld_sort_ordered ld64_sort_ordered 558#define ld_sort_seg_list ld64_sort_seg_list 559#define ld_sunw_ldmach ld64_sunw_ldmach 560#define ld_sunwmove_preprocess ld64_sunwmove_preprocess 561#define ld_sup_atexit ld64_sup_atexit 562#define ld_sup_open ld64_sup_open 563#define ld_sup_file ld64_sup_file 564#define ld_sup_loadso ld64_sup_loadso 565#define ld_sup_input_done ld64_sup_input_done 566#define ld_sup_input_section ld64_sup_input_section 567#define ld_sup_section ld64_sup_section 568#define ld_sup_start ld64_sup_start 569#define ld_swap_reloc_data ld64_swap_reloc_data 570#define ld_sym_add_u ld64_sym_add_u 571#define ld_sym_adjust_vis ld64_sym_adjust_vis 572#define ld_sym_avl_comp ld64_sym_avl_comp 573#define ld_sym_copy ld64_sym_copy 574#define ld_sym_enter ld64_sym_enter 575#define ld_sym_find ld64_sym_find 576#define ld_sym_nodirect ld64_sym_nodirect 577#define ld_sym_process ld64_sym_process 578#define ld_sym_resolve ld64_sym_resolve 579#define ld_sym_spec ld64_sym_spec 580#define ld_targ ld64_targ 581#define ld_targ_init_sparc ld64_targ_init_sparc 582#define ld_targ_init_x86 ld64_targ_init_x86 583#define ld_vers_base ld64_vers_base 584#define ld_vers_check_defs ld64_vers_check_defs 585#define ld_vers_check_need ld64_vers_check_need 586#define ld_vers_def_process ld64_vers_def_process 587#define ld_vers_desc ld64_vers_desc 588#define ld_vers_find ld64_vers_find 589#define ld_vers_need_process ld64_vers_need_process 590#define ld_vers_promote ld64_vers_promote 591#define ld_vers_sym_process ld64_vers_sym_process 592#define ld_vers_verify ld64_vers_verify 593 594#else 595 596#define ld_add_actrel ld32_add_actrel 597#define ld_add_libdir ld32_add_libdir 598#define ld_adj_movereloc ld32_adj_movereloc 599#define ld_am_I_partial ld32_am_I_partial 600#define ld_append_isp ld32_append_isp 601#define ld_ar_member ld32_ar_member 602#define ld_ar_setup ld32_ar_setup 603#define ld_assign_got_TLS ld32_assign_got_TLS 604#define ld_bswap_Word ld32_bswap_Word 605#define ld_bswap_Xword ld32_bswap_Xword 606#define ld_disp_errmsg ld32_disp_errmsg 607#define ld_ent_check ld32_ent_check 608#define ld_exit ld32_exit 609#define ld_find_library ld32_find_library 610#define ld_finish_libs ld32_finish_libs 611#define ld_section_reld_name ld32_section_reld_name 612#define ld_get_group ld32_get_group 613#define ld_lib_setup ld32_lib_setup 614#define ld_init ld32_init 615#define ld_lcm ld32_lcm 616#define ld_make_bss ld32_make_bss 617#define ld_make_data ld32_make_data 618#define ld_make_got ld32_make_got 619#define ld_make_sunwbss ld32_make_sunwbss 620#define ld_make_sunwdata ld32_make_sunwdata 621#define ld_make_sunwmove ld32_make_sunmove 622#define ld_make_text ld32_make_text 623#define ld_map_out ld32_map_out 624#define ld_map_parse ld32_map_parse 625#define ld_open_outfile ld32_open_outfile 626#define ld_place_section ld32_place_section 627#define ld_process_archive ld32_process_archive 628#define ld_process_files ld32_process_files 629#define ld_process_flags ld32_process_flags 630#define ld_process_ifl ld32_process_ifl 631#define ld_process_ordered ld32_process_ordered 632#define ld_process_sym_reloc ld32_process_sym_reloc 633#define ld_reloc_GOT_relative ld32_reloc_GOT_relative 634#define ld_reloc_plt ld32_reloc_plt 635#define ld_reloc_remain_entry ld32_reloc_remain_entry 636#define ld_reloc_targval_get ld32_reloc_targval_get 637#define ld_reloc_targval_set ld32_reloc_targval_set 638#define ld_sec_validate ld32_sec_validate 639#define ld_sort_ordered ld32_sort_ordered 640#define ld_sort_seg_list ld32_sort_seg_list 641#define ld_sunw_ldmach ld32_sunw_ldmach 642#define ld_sunwmove_preprocess ld32_sunwmove_preprocess 643#define ld_sup_atexit ld32_sup_atexit 644#define ld_sup_open ld32_sup_open 645#define ld_sup_file ld32_sup_file 646#define ld_sup_loadso ld32_sup_loadso 647#define ld_sup_input_done ld32_sup_input_done 648#define ld_sup_input_section ld32_sup_input_section 649#define ld_sup_section ld32_sup_section 650#define ld_sup_start ld32_sup_start 651#define ld_swap_reloc_data ld32_swap_reloc_data 652#define ld_sym_add_u ld32_sym_add_u 653#define ld_sym_adjust_vis ld32_sym_adjust_vis 654#define ld_sym_avl_comp ld32_sym_avl_comp 655#define ld_sym_copy ld32_sym_copy 656#define ld_sym_enter ld32_sym_enter 657#define ld_sym_find ld32_sym_find 658#define ld_sym_nodirect ld32_sym_nodirect 659#define ld_sym_process ld32_sym_process 660#define ld_sym_resolve ld32_sym_resolve 661#define ld_sym_spec ld32_sym_spec 662#define ld_targ ld32_targ 663#define ld_targ_init_sparc ld32_targ_init_sparc 664#define ld_targ_init_x86 ld32_targ_init_x86 665#define ld_vers_base ld32_vers_base 666#define ld_vers_check_defs ld32_vers_check_defs 667#define ld_vers_check_need ld32_vers_check_need 668#define ld_vers_def_process ld32_vers_def_process 669#define ld_vers_desc ld32_vers_desc 670#define ld_vers_find ld32_vers_find 671#define ld_vers_need_process ld32_vers_need_process 672#define ld_vers_promote ld32_vers_promote 673#define ld_vers_sym_process ld32_vers_sym_process 674#define ld_vers_verify ld32_vers_verify 675 676#endif 677 678extern uintptr_t dbg_setup(const char *, Dbg_desc *, const char **, int); 679 680extern uintptr_t ld_add_actrel(Word, Rel_desc *, Ofl_desc *); 681extern uintptr_t ld_add_libdir(Ofl_desc *, const char *); 682extern void ld_adj_movereloc(Ofl_desc *, Rel_desc *); 683extern Sym_desc * ld_am_I_partial(Rel_desc *, Xword); 684extern int ld_append_isp(Ofl_desc *, Os_desc *, Is_desc *, int); 685extern void ld_ar_member(Ar_desc *, Elf_Arsym *, Ar_aux *, 686 Ar_mem *); 687extern Ar_desc *ld_ar_setup(const char *, Elf *, Ofl_desc *); 688extern uintptr_t ld_assign_got_TLS(Boolean, Rel_desc *, Ofl_desc *, 689 Sym_desc *, Gotndx *, Gotref, Word, Word, 690 Word, Word); 691 692extern Word ld_bswap_Word(Word); 693extern Xword ld_bswap_Xword(Xword); 694 695extern void ld_disp_errmsg(const char *, Rel_desc *, Ofl_desc *); 696 697extern void ld_ent_check(Ofl_desc *); 698extern int ld_exit(Ofl_desc *); 699 700extern uintptr_t ld_find_library(const char *, Ofl_desc *); 701extern uintptr_t ld_finish_libs(Ofl_desc *); 702 703extern const char *ld_section_reld_name(Sym_desc *, Is_desc *); 704 705extern Group_desc *ld_get_group(Ofl_desc *, Is_desc *); 706 707extern uintptr_t ld_lib_setup(Ofl_desc *); 708 709extern void ld_init(Ofl_desc *); 710 711extern Xword ld_lcm(Xword, Xword); 712 713extern uintptr_t ld_make_bss(Ofl_desc *, Xword, Xword, Bss_Type); 714extern Is_desc *ld_make_data(Ofl_desc *, size_t); 715extern uintptr_t ld_make_got(Ofl_desc *); 716extern uintptr_t ld_make_sunwbss(Ofl_desc *, size_t, Xword); 717extern uintptr_t ld_make_sunwdata(Ofl_desc *, size_t, Xword); 718extern uintptr_t ld_make_sunwmove(Ofl_desc *, int); 719extern Is_desc *ld_make_text(Ofl_desc *, size_t); 720extern void ld_map_out(Ofl_desc *); 721extern uintptr_t ld_map_parse(const char *, Ofl_desc *); 722 723extern uintptr_t ld_open_outfile(Ofl_desc *); 724 725extern Os_desc * ld_place_section(Ofl_desc *, Is_desc *, int, Word); 726extern uintptr_t ld_process_archive(const char *, int, Ar_desc *, 727 Ofl_desc *); 728extern uintptr_t ld_process_files(Ofl_desc *, int, char **); 729extern uintptr_t ld_process_flags(Ofl_desc *, int, char **); 730extern Ifl_desc *ld_process_ifl(const char *, const char *, int, Elf *, 731 Word, Ofl_desc *, Rej_desc *); 732extern uintptr_t ld_process_ordered(Ifl_desc *, Ofl_desc *, Word, Word); 733extern uintptr_t ld_process_sym_reloc(Ofl_desc *, Rel_desc *, Rel *, 734 Is_desc *, const char *); 735 736extern uintptr_t ld_reloc_GOT_relative(Boolean, Rel_desc *, Ofl_desc *); 737extern uintptr_t ld_reloc_plt(Rel_desc *, Ofl_desc *); 738extern void ld_reloc_remain_entry(Rel_desc *, Os_desc *, 739 Ofl_desc *); 740extern int ld_reloc_targval_get(Ofl_desc *, Rel_desc *, 741 uchar_t *, Xword *); 742extern int ld_reloc_targval_set(Ofl_desc *, Rel_desc *, 743 uchar_t *, Xword); 744 745extern void ld_sec_validate(Ofl_desc *); 746extern uintptr_t ld_sort_ordered(Ofl_desc *); 747extern uintptr_t ld_sort_seg_list(Ofl_desc *); 748extern Half ld_sunw_ldmach(); 749extern uintptr_t ld_sunwmove_preprocess(Ofl_desc *); 750extern void ld_sup_atexit(Ofl_desc *, int); 751extern void ld_sup_open(Ofl_desc *, const char **, const char **, 752 int *, int, Elf **, Elf *ref, size_t, 753 const Elf_Kind); 754extern void ld_sup_file(Ofl_desc *, const char *, const Elf_Kind, 755 int flags, Elf *); 756extern uintptr_t ld_sup_loadso(Ofl_desc *, const char *); 757extern void ld_sup_input_done(Ofl_desc *); 758extern void ld_sup_section(Ofl_desc *, const char *, Shdr *, Word, 759 Elf_Data *, Elf *); 760extern uintptr_t ld_sup_input_section(Ofl_desc*, Ifl_desc *, 761 const char *, Shdr **, Word, Elf_Scn *, Elf *); 762extern void ld_sup_start(Ofl_desc *, const Half, const char *); 763extern int ld_swap_reloc_data(Ofl_desc *, Rel_desc *); 764extern Sym_desc *ld_sym_add_u(const char *, Ofl_desc *, Msg); 765extern void ld_sym_adjust_vis(Sym_desc *, Ofl_desc *); 766extern int ld_sym_avl_comp(const void *, const void *); 767extern uintptr_t ld_sym_copy(Sym_desc *); 768extern Sym_desc *ld_sym_enter(const char *, Sym *, Word, Ifl_desc *, 769 Ofl_desc *, Word, Word, Word, Half, avl_index_t *); 770extern Sym_desc *ld_sym_find(const char *, Word, avl_index_t *, 771 Ofl_desc *); 772extern uintptr_t ld_sym_nodirect(Is_desc *, Ifl_desc *, Ofl_desc *); 773extern uintptr_t ld_sym_process(Is_desc *, Ifl_desc *, Ofl_desc *); 774extern uintptr_t ld_sym_resolve(Sym_desc *, Sym *, Ifl_desc *, 775 Ofl_desc *, int, Word, Word); 776extern uintptr_t ld_sym_spec(Ofl_desc *); 777 778extern Target ld_targ; 779extern const Target *ld_targ_init_sparc(void); 780extern const Target *ld_targ_init_x86(void); 781 782extern Ver_desc *ld_vers_base(Ofl_desc *); 783extern uintptr_t ld_vers_check_defs(Ofl_desc *); 784extern uintptr_t ld_vers_check_need(Ofl_desc *); 785extern uintptr_t ld_vers_def_process(Is_desc *, Ifl_desc *, Ofl_desc *); 786extern Ver_desc *ld_vers_desc(const char *, Word, List *); 787extern Ver_desc *ld_vers_find(const char *, Word, List *); 788extern uintptr_t ld_vers_need_process(Is_desc *, Ifl_desc *, Ofl_desc *); 789extern void ld_vers_promote(Sym_desc *, Word, Ifl_desc *, 790 Ofl_desc *); 791extern int ld_vers_sym_process(Lm_list *, Is_desc *, Ifl_desc *); 792extern int ld_vers_verify(Ofl_desc *); 793 794extern uintptr_t add_regsym(Sym_desc *, Ofl_desc *); 795extern Word hashbkts(Word); 796extern Xword lcm(Xword, Xword); 797extern Listnode * list_where(List *, Word); 798 799 800/* 801 * Most platforms have both a 32 and 64-bit variant (e.g. EM_SPARC and 802 * EM_SPARCV9). To support this, there many files in libld that are built 803 * twice, once for ELFCLASS64 (_ELF64), and once for ELFCLASS32. In these 804 * files, we sometimes want to supply one value for the ELFCLASS32 case 805 * and another for ELFCLASS64. The LD_TARG_BYCLASS macro is used to do 806 * this. It is called with both both alternatives, and yields the one 807 * that applies to the current compilation environment. 808 */ 809#ifdef _ELF64 810#define LD_TARG_BYCLASS(_ec32, _ec64) (_ec64) 811#else 812#define LD_TARG_BYCLASS(_ec32, _ec64) (_ec32) 813#endif 814 815 816#ifdef __cplusplus 817} 818#endif 819 820#endif /* _LIBLD_DOT_H */ 821