1*4d9fdb46SRobert Mustacchi /* Copyright (c) 2018, David Anderson
2*4d9fdb46SRobert Mustacchi All rights reserved.
3*4d9fdb46SRobert Mustacchi 
4*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with
5*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the
6*4d9fdb46SRobert Mustacchi following conditions are met:
7*4d9fdb46SRobert Mustacchi 
8*4d9fdb46SRobert Mustacchi     Redistributions of source code must retain the above
9*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
10*4d9fdb46SRobert Mustacchi     disclaimer.
11*4d9fdb46SRobert Mustacchi 
12*4d9fdb46SRobert Mustacchi     Redistributions in binary form must reproduce the above
13*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
14*4d9fdb46SRobert Mustacchi     disclaimer in the documentation and/or other materials
15*4d9fdb46SRobert Mustacchi     provided with the distribution.
16*4d9fdb46SRobert Mustacchi 
17*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
18*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
19*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
29*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*4d9fdb46SRobert Mustacchi */
31*4d9fdb46SRobert Mustacchi 
32*4d9fdb46SRobert Mustacchi #ifndef DWARF_OBJECT_DETECTOR_H
33*4d9fdb46SRobert Mustacchi #define DWARF_OBJECT_DETECTOR_H
34*4d9fdb46SRobert Mustacchi 
35*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
36*4d9fdb46SRobert Mustacchi extern "C" {
37*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
38*4d9fdb46SRobert Mustacchi 
39*4d9fdb46SRobert Mustacchi 
40*4d9fdb46SRobert Mustacchi /*  Declares the interface function.
41*4d9fdb46SRobert Mustacchi     outpath is a place you provide, of a length outpath_len
42*4d9fdb46SRobert Mustacchi     you consider reasonable,
43*4d9fdb46SRobert Mustacchi     where the final path used is recorded.
44*4d9fdb46SRobert Mustacchi     outpath_len must be larger than strlen(path);
45*4d9fdb46SRobert Mustacchi 
46*4d9fdb46SRobert Mustacchi     This matters as for mach-o if the path is a directory
47*4d9fdb46SRobert Mustacchi     name the function will look in the standard macho-place
48*4d9fdb46SRobert Mustacchi     for the object file (useful for dSYM) and return the
49*4d9fdb46SRobert Mustacchi     constructed path in oupath.
50*4d9fdb46SRobert Mustacchi     returns DW_DLV_OK, DW_DLV_ERROR, or DW_DLV_NO_ENTRY */
51*4d9fdb46SRobert Mustacchi 
52*4d9fdb46SRobert Mustacchi #ifndef DW_FTYPE_UNKNOWN
53*4d9fdb46SRobert Mustacchi #define DW_FTYPE_UNKNOWN 0
54*4d9fdb46SRobert Mustacchi #define DW_FTYPE_ELF     1
55*4d9fdb46SRobert Mustacchi #define DW_FTYPE_MACH_O  2
56*4d9fdb46SRobert Mustacchi #define DW_FTYPE_PE      3
57*4d9fdb46SRobert Mustacchi #define DW_FTYPE_ARCHIVE 4  /* unix archive */
58*4d9fdb46SRobert Mustacchi #endif /* DW_FTYPE_UNKNOWN */
59*4d9fdb46SRobert Mustacchi 
60*4d9fdb46SRobert Mustacchi #ifndef DW_ENDIAN_UNKNOWN
61*4d9fdb46SRobert Mustacchi #define DW_ENDIAN_UNKNOWN 0
62*4d9fdb46SRobert Mustacchi #define DW_ENDIAN_BIG     1
63*4d9fdb46SRobert Mustacchi #define DW_ENDIAN_LITTLE  2
64*4d9fdb46SRobert Mustacchi #endif /* DW_ENDIAN_UNKNOWN */
65*4d9fdb46SRobert Mustacchi 
66*4d9fdb46SRobert Mustacchi /*  offsetsize refers to the object-file-format.
67*4d9fdb46SRobert Mustacchi     Elf 32 or macho-32 or PE 32, for example.
68*4d9fdb46SRobert Mustacchi     Not to DWARF offset sizes.  */
69*4d9fdb46SRobert Mustacchi 
70*4d9fdb46SRobert Mustacchi /*  Path means look(first) for an dynsym object
71*4d9fdb46SRobert Mustacchi     of the same name per MacOS standards,
72*4d9fdb46SRobert Mustacchi     making the outpath space needed is more than
73*4d9fdb46SRobert Mustacchi     that in path.
74*4d9fdb46SRobert Mustacchi     Copies the actual path into outpath, (an error
75*4d9fdb46SRobert Mustacchi     if the length in outpath_len is less than needed
76*4d9fdb46SRobert Mustacchi     for the object found).
77*4d9fdb46SRobert Mustacchi     For non-MacOS outpath will contain the string
78*4d9fdb46SRobert Mustacchi     taken from path.
79*4d9fdb46SRobert Mustacchi 
80*4d9fdb46SRobert Mustacchi     If DW_DLV_NO_ENTRY or DW_DLV_ERROR returned
81*4d9fdb46SRobert Mustacchi     the argument values other than path
82*4d9fdb46SRobert Mustacchi     must be considered to be in an unknown state. */
83*4d9fdb46SRobert Mustacchi 
84*4d9fdb46SRobert Mustacchi /*  The errcode is a small integer distinct from libdwarf
85*4d9fdb46SRobert Mustacchi     and simply printing the integer (returned through
86*4d9fdb46SRobert Mustacchi     *errcode when the function returns DW_DLV_ERROR)
87*4d9fdb46SRobert Mustacchi     will hopefully suffice for most purposes. */
88*4d9fdb46SRobert Mustacchi 
89*4d9fdb46SRobert Mustacchi int dwarf_object_detector_path(const char  *path,
90*4d9fdb46SRobert Mustacchi     char *outpath,
91*4d9fdb46SRobert Mustacchi     unsigned long outpath_len,
92*4d9fdb46SRobert Mustacchi     unsigned *ftype,
93*4d9fdb46SRobert Mustacchi     unsigned *endian,
94*4d9fdb46SRobert Mustacchi     unsigned *offsetsize,
95*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  *filesize,
96*4d9fdb46SRobert Mustacchi     int * errcode);
97*4d9fdb46SRobert Mustacchi 
98*4d9fdb46SRobert Mustacchi int dwarf_object_detector_fd(int fd,
99*4d9fdb46SRobert Mustacchi     unsigned *ftype,
100*4d9fdb46SRobert Mustacchi     unsigned *endian,
101*4d9fdb46SRobert Mustacchi     unsigned *offsetsize,
102*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  *filesize,
103*4d9fdb46SRobert Mustacchi     int * errcode);
104*4d9fdb46SRobert Mustacchi 
105*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
106*4d9fdb46SRobert Mustacchi }
107*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
108*4d9fdb46SRobert Mustacchi #endif /* DWARF_OBJECT_DETECTOR_H */
109