1.\" Copyright (c) 2011 Kai Wang
2.\" All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\"
13.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23.\" SUCH DAMAGE.
24.\"
25.\" $Id: dwarf_producer_init.3 3644 2018-10-15 19:55:01Z jkoshy $
26.\"
27.Dd August 20, 2011
28.Dt DWARF_PRODUCER_INIT 3
29.Os
30.Sh NAME
31.Nm dwarf_producer_init ,
32.Nm dwarf_producer_init_b
33.Nd allocate a DWARF producer descriptor
34.Sh LIBRARY
35.Lb libdwarf
36.Sh SYNOPSIS
37.In libdwarf.h
38.Ft Dwarf_P_Debug
39.Fo dwarf_producer_init
40.Fa "Dwarf_Unsigned flags"
41.Fa "Dwarf_Callback_Func func"
42.Fa "Dwarf_Handler errhand"
43.Fa "Dwarf_Ptr errarg"
44.Fa "Dwarf_Error *err"
45.Fc
46.Ft Dwarf_P_Debug
47.Fo dwarf_producer_init_b
48.Fa "Dwarf_Unsigned flags"
49.Fa "Dwarf_Callback_Func_b func"
50.Fa "Dwarf_Handler errhand"
51.Fa "Dwarf_Ptr errarg"
52.Fa "Dwarf_Error *error"
53.Fc
54.Sh DESCRIPTION
55These functions allocate and return a
56.Vt Dwarf_P_Debug
57descriptor representing a DWARF producer instance.
58.Pp
59The argument
60.Ar errhand
61should contain the address of a function to be called in case of an
62error.
63If this argument is
64.Dv NULL ,
65the default error handling scheme is used, see
66.Xr dwarf 3 .
67.Pp
68The argument
69.Ar errarg
70will be passed to the error handler function when it is invoked.
71.Pp
72The argument
73.Ar err
74references a memory location that would hold a
75.Vt Dwarf_Error
76descriptor in case of an error.
77.Pp
78The argument
79.Ar flags
80specifies additional characteristics of the DWARF producer instance.
81The following flags are recognized:
82.Bl -tag -width "Dv DW_DLC_ISA_MIPS"
83.It Dv DW_DLC_ISA_IA64
84.Pq Deprecated
85The target instruction set architecture is IA64.
86This flag is deprecated.
87Application code should use the
88.Xr dwarf_producer_set_isa 3
89function to specify target instruction set architecture.
90.It Dv DW_DLC_ISA_MIPS
91.Pq Deprecated
92The target instruction set architecture is MIPS.
93This flag is deprecated.
94Application code should use the
95.Xr dwarf_producer_set_isa 3
96function to specify target instruction set architecture.
97.It Dv DW_DLC_SIZE_32
98.Pq Default
99The target address size is 32-bit.
100.It Dv DW_DLC_SIZE_64
101The target address size is 64-bit.
102.It Dv DW_DLC_STREAM_RELOCATIONS
103.Pq Default
104Generate stream relocations.
105.It Dv DW_DLC_SYMBOLIC_RELOCATIONS
106Generate symbolic relocations.
107.It Dv DW_DLC_TARGET_BIGENDIAN
108The target is big endian.
109.It Dv DW_DLC_TARGET_LITTLEENDIAN
110The target is little endian.
111.It Dv DW_DLC_WRITE
112.Pq Required
113Permit writing of DWARF information.
114.El
115.Pp
116The following flags are mutually exclusive.
117.Bl -bullet -compact
118.It
119Flags
120.Dv DW_DLC_ISA_IA64
121and
122.Dv DW_DLC_ISA_MIPS .
123.It
124Flags
125.Dv DW_DLC_SIZE_32
126and
127.Dv DW_DLC_SIZE_64 .
128.It
129Flags
130.Dv DW_DLC_STREAM_RELOCATIONS
131and
132.Dv DW_DLC_SYMBOLIC_RELOCATIONS .
133.It
134Flags
135.Dv DW_DLC_TARGET_BIGENDIAN
136and
137.Dv DW_DLC_TARGET_LITTLEENDIAN .
138.El
139If neither of the flags
140.Dv DW_DLC_TARGET_BIGENDIAN
141and
142.Dv DW_DLC_TARGET_LITTLEENDIAN
143is set, the target's endianness is assumed to be the same as the host's
144endianness.
145.Pp
146Argument
147.Ar func
148should point to an application-provided callback function of type
149.Vt Dwarf_Callback_Func_b .
150The type
151.Vt Dwarf_Callback_Func_b
152is defined in the header file
153.In libdwarf.h
154as:
155.Bd -literal -offset indent
156typedef int (*Dwarf_Callback_Func_b)(char *name, int size,
157    Dwarf_Unsigned type, Dwarf_Unsigned flags, Dwarf_Unsigned link,
158    Dwarf_Unsigned info, Dwarf_Unsigned *index, int *error);
159.Ed
160.Pp
161This function is called by the
162.Lb libdwarf
163once for each section in the object file that the library needs to
164create.
165The arguments to this callback function specify the values in the ELF
166section header for the section being created:
167.Pp
168.Bl -tag -width indent -compact -offset indent
169.It Ar name
170The name of the section being created.
171.It Ar size
172The
173.Va sh_size
174value in the section header.
175.It Ar type
176The
177.Va sh_type
178value in the section header.
179.It Ar flags
180The
181.Va sh_flags
182value in the section header.
183.It Ar link
184The
185.Va sh_link
186value in the section header.
187.It Ar info
188The
189.Va sh_info
190value in the section header.
191.El
192.Pp
193On success, the callback function should return the section index
194value of the created section, and set the location pointed to by
195argument
196.Ar index
197to the symbol table index of the symbol that associated with the newly
198created section.
199This symbol table index will be used in relocation entries
200referring to the created section.
201.Pp
202In case of failure, the callback function should return -1 and set the
203location pointed to by argument
204.Ar error
205to an application-defined error code.
206This application returned error code is currently ignored by the
207library.
208.Pp
209Function
210.Fn dwarf_producer_init
211is deprecated.
212Function
213.Fn dwarf_producer_init
214is identical to function
215.Fn dwarf_producer_init_b
216except that the callback function it expects can not properly handle
217arbitrary section symbol index values.
218.Ss Memory Management
219The
220.Vt Dwarf_P_Debug
221instance returned by these functions should be freed using the
222function
223.Fn dwarf_producer_finish .
224.Sh RETURN VALUES
225On success, these functions return the created DWARF producer
226descriptor.
227In case of an error, they return
228.Dv DW_DLV_BADADDR
229and set the argument
230.Ar err .
231.Sh EXAMPLES
232To initialize a
233.Vt Dwarf_P_Debug
234instance for a MIPS32 big endian object, use:
235.Bd -literal -offset indent
236Dwarf_P_Debug dbg;
237Dwarf_Unsigned flags;
238Dwarf_Error de;
239
240/* ... assume cb_func points to the callback function ... */
241
242flags = DW_DLC_WRITE | DW_DLC_SIZE_32 | DW_DLC_ISA_MIPS |
243    DW_DLC_STREAM_RELOCATIONS | DW_DLC_TARGET_BIGENDIAN;
244if ((dbg = dwarf_producer_init(flags, cb_func, NULL, NULL, &de)) ==
245    DW_DLV_BADADDR)
246	warnx("dwarf_producer_init failed: %s", dwarf_errmsg(-1));
247.Ed
248.Sh ERRORS
249These functions can fail with:
250.Bl -tag -width ".Bq Er DW_DLE_NO_ENTRY"
251.It Bq Er DW_DLE_ARGUMENT
252Argument
253.Ar func
254was NULL.
255.It Bq Er DW_DLE_ARGUMENT
256The flag
257.Dv DW_DLC_WRITE
258was not set in argument
259.Ar flags .
260.It Bq Er DW_DLE_ARGUMENT
261The flags
262.Dv DW_DLC_SIZE_32
263and
264.Dv DW_DLC_SIZE_64
265were both set in argument
266.Ar flags .
267.It Bq Er DW_DLE_ARGUMENT
268The flags
269.Dv DW_DLC_ISA_IA64
270and
271.Dv DW_DLC_ISA_MIPS
272were both set in argument
273.Ar flags .
274.It Bq Er DW_DLE_ARGUMENT
275The flags
276.Dv DW_DLC_TARGET_BIGENDIAN
277and
278.Dv DW_DLC_TARGET_LITTLEENDIAN
279were both set in argument
280.Ar flags .
281.It Bq Er DW_DLE_ARGUMENT
282The flags
283.Dv DW_DLC_STREAM_RELOCATIONS
284and
285.Dv DW_DLC_SYMBOLIC_RELOCATIONS
286were both set in argument
287.Ar flags .
288.It Bq Er DW_DLE_MEMORY
289An out of memory condition was encountered.
290.El
291.Sh SEE ALSO
292.Xr dwarf 3 ,
293.Xr dwarf_errmsg 3 ,
294.Xr dwarf_producer_finish 3 ,
295.Xr dwarf_producer_set_isa 3 ,
296.Xr dwarf_transform_to_disk_form 3
297