0001
0002 #ifndef _GNU_SOURCE
0003 #define _GNU_SOURCE
0004 #endif
0005 #include <link.h>
0006 #include <stdio.h>
0007 #include <stdlib.h>
0008
0009 struct Statistics {
0010 unsigned long long load_address;
0011 unsigned long long alignment;
0012 };
0013
0014 int ExtractStatistics(struct dl_phdr_info *info, size_t size, void *data)
0015 {
0016 struct Statistics *stats = (struct Statistics *) data;
0017 int i;
0018
0019 if (info->dlpi_name != NULL && info->dlpi_name[0] != '\0') {
0020
0021 return 2;
0022 }
0023
0024 stats->load_address = (unsigned long long) info->dlpi_addr;
0025 stats->alignment = 0;
0026
0027 for (i = 0; i < info->dlpi_phnum; i++) {
0028 if (info->dlpi_phdr[i].p_type != PT_LOAD)
0029 continue;
0030
0031 if (info->dlpi_phdr[i].p_align > stats->alignment)
0032 stats->alignment = info->dlpi_phdr[i].p_align;
0033 }
0034
0035 return 1;
0036 }
0037
0038 int main(int argc, char **argv)
0039 {
0040 struct Statistics extracted;
0041 unsigned long long misalign;
0042 int ret;
0043
0044 ret = dl_iterate_phdr(ExtractStatistics, &extracted);
0045 if (ret != 1) {
0046 fprintf(stderr, "FAILED\n");
0047 return 1;
0048 }
0049
0050 if (extracted.alignment == 0) {
0051 fprintf(stderr, "No alignment found\n");
0052 return 1;
0053 } else if (extracted.alignment & (extracted.alignment - 1)) {
0054 fprintf(stderr, "Alignment is not a power of 2\n");
0055 return 1;
0056 }
0057
0058 misalign = extracted.load_address & (extracted.alignment - 1);
0059 if (misalign) {
0060 printf("alignment = %llu, load_address = %llu\n",
0061 extracted.alignment, extracted.load_address);
0062 fprintf(stderr, "FAILED\n");
0063 return 1;
0064 }
0065
0066 fprintf(stderr, "PASS\n");
0067 return 0;
0068 }