1 #include <sys/types.h> 2 #include <sys/exec_elf.h> 3 4 #include <assert.h> 5 #include <dlfcn.h> 6 #include <link.h> 7 #include <stddef.h> 8 #include <string.h> 9 10 static int 11 nonzero(char *s, size_t n) 12 { 13 size_t i; 14 15 for (i = 0; i < n; i++) 16 if (s[i] != 0) 17 return (1); 18 19 return (0); 20 } 21 22 static int foundldso = 0; 23 24 static int 25 callback(struct dl_phdr_info *info, size_t size, void *cookie) 26 { 27 int i; 28 int foundrandomize = 0; 29 30 assert(size >= sizeof(struct dl_phdr_info)); 31 32 if (strcmp(info->dlpi_name, "/usr/libexec/ld.so") != 0) 33 return (0); 34 foundldso = 1; 35 36 for (i = 0; i < info->dlpi_phnum; i++) 37 if (info->dlpi_phdr[i].p_type == PT_OPENBSD_RANDOMIZE) { 38 foundrandomize = 1; 39 assert(nonzero((char *)(info->dlpi_phdr[i].p_vaddr + 40 info->dlpi_addr), info->dlpi_phdr[i].p_memsz)); 41 } 42 43 assert(foundrandomize); 44 return (0); 45 } 46 47 int 48 main() 49 { 50 dl_iterate_phdr(callback, NULL); 51 assert(foundldso); 52 return (0); 53 } 54