summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen Webb <swebb@blackberry.com>2020-06-11 17:56:08 -0400
committerDave Watson <dade.watson@gmail.com>2020-06-18 13:42:19 -0700
commitd4f91519bb0352259aaea484ddce60ad12f1f444 (patch)
tree54540d5f1051981106c1e7c4d4f5a22e5d2086c3 /src
parent12e70a59df9a2e1c436c79c1dba941ca555db843 (diff)
downloadlibunwind-d4f91519bb0352259aaea484ddce60ad12f1f444.tar.gz
Handle <elf.h> that uses enums instead of defines
Handle the case in which the system-supplied elf.h file uses C enums instead of macros preprocessor defines for some constants. Made the inclusion of the discovered elf.h file more consistent for portability to non-Linux targets. Put some libunwind-specific ELF macros into the UNW_ namespace.
Diffstat (limited to 'src')
-rw-r--r--src/coredump/_UCD_create.c6
-rw-r--r--src/coredump/_UCD_elf_map_image.c6
-rw-r--r--src/coredump/_UCD_find_proc_info.c6
-rw-r--r--src/coredump/_UCD_get_proc_name.c4
-rw-r--r--src/elf32.h4
-rw-r--r--src/elf64.h4
-rw-r--r--src/elfxx.h4
-rw-r--r--src/ptrace/_UPT_get_proc_name.c4
8 files changed, 25 insertions, 13 deletions
diff --git a/src/coredump/_UCD_create.c b/src/coredump/_UCD_create.c
index c9e6d07c..e070d8ba 100644
--- a/src/coredump/_UCD_create.c
+++ b/src/coredump/_UCD_create.c
@@ -31,7 +31,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <byteswap.h>
#endif
-#include <elf.h>
+#if defined(HAVE_ELF_H)
+# include <elf.h>
+#if defined(HAVE_SYS_ELF_H)
+# include <sys/elf.h>
+#endif
#include <sys/procfs.h> /* struct elf_prstatus */
#include "_UCD_lib.h"
diff --git a/src/coredump/_UCD_elf_map_image.c b/src/coredump/_UCD_elf_map_image.c
index 4b3db0bb..99fd25e8 100644
--- a/src/coredump/_UCD_elf_map_image.c
+++ b/src/coredump/_UCD_elf_map_image.c
@@ -21,7 +21,11 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-#include <elf.h>
+#if defined(HAVE_ELF_H)
+# include <elf.h>
+#elif defined(HAVE_SYS_ELF_H)
+# include <sys/elf.h>
+#endif
#include "_UCD_lib.h"
#include "_UCD_internal.h"
diff --git a/src/coredump/_UCD_find_proc_info.c b/src/coredump/_UCD_find_proc_info.c
index 33b66c8e..cb003401 100644
--- a/src/coredump/_UCD_find_proc_info.c
+++ b/src/coredump/_UCD_find_proc_info.c
@@ -21,7 +21,11 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-#include <elf.h>
+#if defined(HAVE_ELF_H)
+# include <elf.h>
+#elif defined(HAVE_SYS_ELF_H)
+# include <sys/elf.h>
+#endif
#include "_UCD_lib.h"
#include "_UCD_internal.h"
diff --git a/src/coredump/_UCD_get_proc_name.c b/src/coredump/_UCD_get_proc_name.c
index 3a4c9b82..cd5ee892 100644
--- a/src/coredump/_UCD_get_proc_name.c
+++ b/src/coredump/_UCD_get_proc_name.c
@@ -64,9 +64,9 @@ _UCD_get_proc_name (unw_addr_space_t as, unw_word_t ip,
{
struct UCD_info *ui = arg;
-#if ELF_CLASS == ELFCLASS64
+#if UNW_ELF_CLASS == UNW_ELFCLASS64
return _Uelf64_CD_get_proc_name (ui, as, ip, buf, buf_len, offp);
-#elif ELF_CLASS == ELFCLASS32
+#elif UNW_ELF_CLASS == UNW_ELFCLASS32
return _Uelf32_CD_get_proc_name (ui, as, ip, buf, buf_len, offp);
#else
return -UNW_ENOINFO;
diff --git a/src/elf32.h b/src/elf32.h
index 2c7bca4c..9747630a 100644
--- a/src/elf32.h
+++ b/src/elf32.h
@@ -1,8 +1,8 @@
#ifndef elf32_h
#define elf32_h
-#ifndef ELF_CLASS
-#define ELF_CLASS ELFCLASS32
+#ifndef UNW_ELF_CLASS
+# define UNW_ELF_CLASS UNW_ELFCLASS32
#endif
#include "elfxx.h"
diff --git a/src/elf64.h b/src/elf64.h
index 091fba8e..1956c73c 100644
--- a/src/elf64.h
+++ b/src/elf64.h
@@ -1,8 +1,8 @@
#ifndef elf64_h
#define elf64_h
-#ifndef ELF_CLASS
-#define ELF_CLASS ELFCLASS64
+#ifndef UNW_ELF_CLASS
+# define UNW_ELF_CLASS UNW_ELFCLASS64
#endif
#include "elfxx.h"
diff --git a/src/elfxx.h b/src/elfxx.h
index 830432c2..fe5fcbcd 100644
--- a/src/elfxx.h
+++ b/src/elfxx.h
@@ -32,7 +32,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include "libunwind_i.h"
-#if ELF_CLASS == ELFCLASS32
+#if UNW_ELF_CLASS == UNW_ELFCLASS32
# define ELF_W(x) ELF32_##x
# define Elf_W(x) Elf32_##x
# define elf_w(x) _Uelf32_##x
@@ -64,7 +64,7 @@ elf_w (valid_object) (struct elf_image *ei)
return 0;
return (memcmp (ei->image, ELFMAG, SELFMAG) == 0
- && ((uint8_t *) ei->image)[EI_CLASS] == ELF_CLASS
+ && ((uint8_t *) ei->image)[EI_CLASS] == UNW_ELF_CLASS
&& ((uint8_t *) ei->image)[EI_VERSION] != EV_NONE
&& ((uint8_t *) ei->image)[EI_VERSION] <= EV_CURRENT);
}
diff --git a/src/ptrace/_UPT_get_proc_name.c b/src/ptrace/_UPT_get_proc_name.c
index 79c1f38e..4fc93e74 100644
--- a/src/ptrace/_UPT_get_proc_name.c
+++ b/src/ptrace/_UPT_get_proc_name.c
@@ -32,9 +32,9 @@ _UPT_get_proc_name (unw_addr_space_t as, unw_word_t ip,
{
struct UPT_info *ui = arg;
-#if ELF_CLASS == ELFCLASS64
+#if UNW_ELF_CLASS == UNW_ELFCLASS64
return _Uelf64_get_proc_name (as, ui->pid, ip, buf, buf_len, offp);
-#elif ELF_CLASS == ELFCLASS32
+#elif UNW_ELF_CLASS == UNW_ELFCLASS32
return _Uelf32_get_proc_name (as, ui->pid, ip, buf, buf_len, offp);
#else
return -UNW_ENOINFO;