Fix: lttng-ust-elf.c: define NT_GNU_BUILD_ID if not defined
[lttng-ust.git] / liblttng-ust / lttng-ust-elf.c
index 346545583c3a23b399b9a71911c59e5ded6bc387..a496841adb8804d6182ce901f52e9835828c5744 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <helper.h>
 #include <string.h>
 #include <lttng/align.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <stdbool.h>
 #include "lttng-tracer-core.h"
 
 #define BUF_LEN        4096
 
+#ifndef NT_GNU_BUILD_ID
+# define NT_GNU_BUILD_ID       3
+#endif
+
 /*
  * Retrieve the nth (where n is the `index` argument) phdr (program
  * header) from the given elf instance.
@@ -354,7 +360,7 @@ void lttng_ust_elf_destroy(struct lttng_ust_elf *elf)
 int lttng_ust_elf_get_memsz(struct lttng_ust_elf *elf, uint64_t *memsz)
 {
        uint16_t i;
-       uint64_t _memsz = 0;
+       uint64_t low_addr = UINT64_MAX, high_addr = 0;
 
        if (!elf || !memsz) {
                goto error;
@@ -362,7 +368,6 @@ int lttng_ust_elf_get_memsz(struct lttng_ust_elf *elf, uint64_t *memsz)
 
        for (i = 0; i < elf->ehdr->e_phnum; ++i) {
                struct lttng_ust_elf_phdr *phdr;
-               uint64_t align;
 
                phdr = lttng_ust_elf_get_phdr(elf, i);
                if (!phdr) {
@@ -377,27 +382,19 @@ int lttng_ust_elf_get_memsz(struct lttng_ust_elf *elf, uint64_t *memsz)
                        goto next_loop;
                }
 
-               /*
-                * A p_align of 0 means no alignment, i.e. aligned to
-                * 1 byte.
-                */
-               align = phdr->p_align == 0 ? 1 : phdr->p_align;
-               /* Align the start of the segment. */
-               _memsz += offset_align(_memsz, align);
-               _memsz += phdr->p_memsz;
-               /*
-                * Add padding at the end of the segment, so it ends
-                * on a multiple of the align value (which usually
-                * means a page boundary). This makes the computation
-                * valid even in cases where p_align would change from
-                * one segment to the next.
-                */
-               _memsz += offset_align(_memsz, align);
+               low_addr = min_t(uint64_t, low_addr, phdr->p_vaddr);
+               high_addr = max_t(uint64_t, high_addr,
+                               phdr->p_vaddr + phdr->p_memsz);
        next_loop:
                free(phdr);
        }
 
-       *memsz = _memsz;
+       if (high_addr < low_addr) {
+               /* No PT_LOAD segments or corrupted data. */
+               goto error;
+       }
+
+       *memsz = high_addr - low_addr;
        return 0;
 error:
        return -1;
This page took 0.023832 seconds and 4 git commands to generate.