brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 534f5f9 Raw
96 lines · c
1/* RUN: %clang_msan -g %s -o %t2   RUN: %clang_msan -g %s -DBUILD_SO -fPIC -o %t-so.so -shared3   RUN: %run %t 2>&1 | FileCheck %s4 5   REQUIRES: glibc{{.*}}6*/7 8#define _GNU_SOURCE9 10#ifndef BUILD_SO11#include <assert.h>12#include <dlfcn.h>13#include <elf.h>14#include <link.h>15#include <stdio.h>16#include <stdlib.h>17 18typedef volatile long *(* get_t)();19get_t GetTls;20 21int main(int argc, char *argv[]) {22  char path[4096];23  snprintf(path, sizeof(path), "%s-so.so", argv[0]);24  int i;25 26  void *handle = dlopen(path, RTLD_LAZY);27  if (!handle) fprintf(stderr, "%s\n", dlerror());28  assert(handle != 0);29  GetTls = (get_t)dlsym(handle, "GetTls");30  assert(dlerror() == 0);31 32  {33    printf("Testing RTLD_DL_LINKMAP\n");34    fflush(stdout);35 36    Dl_info info;37    struct link_map *map_ptr;38    int ret = dladdr1(GetTls, &info, (void**)(&map_ptr), RTLD_DL_LINKMAP);39    assert(ret != 0);40    printf("fname: %s\n", info.dli_fname);41    printf("fbase: %p\n", info.dli_fbase);42    printf("sname: %s\n", info.dli_sname);43    // CHECK: sname: GetTls44    printf("saddr: %p\n", info.dli_saddr);45 46    assert(map_ptr != NULL);47    printf("map_ptr: %p\n", map_ptr);48    fflush(stdout);49 50    // Find the start of the link map51    while(map_ptr->l_prev != NULL) {52      fflush(stdout);53      map_ptr = map_ptr->l_prev;54    }55 56    fflush(stdout);57    while(map_ptr != NULL) {58      assert(map_ptr->l_name != NULL);59      printf("0x%lx: '%s', %p\n", map_ptr->l_addr, map_ptr->l_name, map_ptr->l_ld);60      fflush(stdout);61      map_ptr = map_ptr->l_next;62    }63    // CHECK: libc{{[\-]*.*}}.so64    // CHECK: dladdr1_test65  }66 67  // Test RTLD_DL_SYMENT68 69  {70    printf("Testing RTLD_DL_SYMENT\n");71    fflush(stdout);72 73    Dl_info info;74    ElfW(Sym) *sym;75    int ret = dladdr1(GetTls, &info, (void**)(&sym), RTLD_DL_SYMENT);76    assert(ret != 0);77    printf("fname: %s\n", info.dli_fname);78    printf("fbase: %p\n", info.dli_fbase);79    printf("sname: %s\n", info.dli_sname);80    // CHECK: sname: GetTls81    printf("saddr: %p\n", info.dli_saddr);82 83    printf("sym: %d %d %d %d %lu %lu\n",84           sym->st_name, sym->st_info, sym->st_other,85           sym->st_shndx, sym->st_value, sym->st_size);86    // CHECK: sym:87  }88  return 0;89}90#else  // BUILD_SO91long var;92long *GetTls() {93  return &var;94}95#endif96