1 // SPDX-License-Identifier: GPL-2.0-only
10 unsigned long long load_address;
11 unsigned long long alignment;
14 int ExtractStatistics(struct dl_phdr_info *info, size_t size, void *data)
16 struct Statistics *stats = (struct Statistics *) data;
19 if (info->dlpi_name != NULL && info->dlpi_name[0] != '\0') {
20 // Ignore headers from other than the executable.
24 stats->load_address = (unsigned long long) info->dlpi_addr;
27 for (i = 0; i < info->dlpi_phnum; i++) {
28 if (info->dlpi_phdr[i].p_type != PT_LOAD)
31 if (info->dlpi_phdr[i].p_align > stats->alignment)
32 stats->alignment = info->dlpi_phdr[i].p_align;
35 return 1; // Terminate dl_iterate_phdr.
38 int main(int argc, char **argv)
40 struct Statistics extracted;
41 unsigned long long misalign;
44 ret = dl_iterate_phdr(ExtractStatistics, &extracted);
46 fprintf(stderr, "FAILED\n");
50 if (extracted.alignment == 0) {
51 fprintf(stderr, "No alignment found\n");
53 } else if (extracted.alignment & (extracted.alignment - 1)) {
54 fprintf(stderr, "Alignment is not a power of 2\n");
58 misalign = extracted.load_address & (extracted.alignment - 1);
60 printf("alignment = %llu, load_address = %llu\n",
61 extracted.alignment, extracted.load_address);
62 fprintf(stderr, "FAILED\n");
66 fprintf(stderr, "PASS\n");