_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