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
10static int
11nonzero(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
22static int foundldso = 0;
23
24static int
25callback(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
47int
48main()
49{
50	dl_iterate_phdr(callback, NULL);
51	assert(foundldso);
52	return (0);
53}
54