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