$ objcopy --only-keep-debug main.elf main.elf.debug
$ strip -g main.elf
$ objcopy --add-gnu-debuglink=main.elf.debug main.elf
+
+There is also a series of tests used to check detection of
+position-independent code (PIC). These tests use three pre-compiled
+ELF files found under `data/pic/`, namely `hello.exec`, `hello.pie`,
+and `hello.pic`. These can be re-generated using the files `hello.c`
+and `libhello.c`, with the following commands:
+
+ $ gcc hello.c -o hello.exec
+ $ gcc hello.c -fPIC -pie -o hello.pie
+ $ gcc -shared -o hello.pic -fPIC libhello.c
#define NUM_ARCH 4
#define NUM_TESTS_PER_ARCH 11
-#define NUM_TESTS (NUM_ARCH * NUM_TESTS_PER_ARCH) + 1
+#define NUM_TESTS_PIC 3
+#define NUM_TESTS (NUM_ARCH * NUM_TESTS_PER_ARCH) + NUM_TESTS_PIC + 1
/*
* Expected memsz were computed using libelf, build ID and debug link
lttng_ust_elf_destroy(elf);
}
+static
+void test_pic(const char *test_dir)
+{
+ char exec_path[PATH_MAX];
+ char pie_path[PATH_MAX];
+ char pic_path[PATH_MAX];
+ struct lttng_ust_elf *elf = NULL;
+ uint8_t is_pic;
+
+ snprintf(exec_path, PATH_MAX, "%s/data/pic/hello.exec", test_dir);
+ snprintf(pie_path, PATH_MAX, "%s/data/pic/hello.pie", test_dir);
+ snprintf(pic_path, PATH_MAX, "%s/data/pic/hello.pic", test_dir);
+
+ elf = lttng_ust_elf_create(exec_path);
+ is_pic = lttng_ust_elf_is_pic(elf);
+ ok(is_pic == 0, "hello.exec is not PIC");
+ lttng_ust_elf_destroy(elf);
+
+ elf = lttng_ust_elf_create(pie_path);
+ is_pic = lttng_ust_elf_is_pic(elf);
+ ok(is_pic == 1, "hello.pie is PIC");
+ lttng_ust_elf_destroy(elf);
+
+ elf = lttng_ust_elf_create(pic_path);
+ is_pic = lttng_ust_elf_is_pic(elf);
+ ok(is_pic == 1, "hello.pic is PIC");
+ lttng_ust_elf_destroy(elf);
+}
+
int main(int argc, char **argv)
{
const char *test_dir;
test_elf(test_dir, "armeb", ARMEB_MEMSZ, armeb_build_id, ARMEB_CRC);
test_elf(test_dir, "aarch64_be", AARCH64_BE_MEMSZ, aarch64_be_build_id,
AARCH64_BE_CRC);
+ test_pic(test_dir);
return EXIT_SUCCESS;
}