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