Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
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         // Ignore headers from other than the executable.
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;  // Terminate dl_iterate_phdr.
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 }