dl_iterate_phdr(3) Library Functions Manual dl_iterate_phdr(3) dl_iterate_phdr - (libc -lc) #define _GNU_SOURCE /* feature_test_macros(7) */ #include int dl_iterate_phdr( typeof(int (struct dl_phdr_info *info, size_t size, void *data)) *callback, void *data); dl_iterate_phdr() . dl_iterate_phdr() callback callback . callback : info size info data ( data) dl_iterate_phdr(). info : struct dl_phdr_info { ElfW(Addr) dlpi_addr; /* */ const char *dlpi_name; /* ( ) */ const ElfW(Phdr) *dlpi_phdr; /* ELF */ ElfW(Half) dlpi_phnum; /* dlpi_phdr */ /* glibc 2.4 . size dl_iterate_phdr callback . */ unsigned long long dlpi_adds; /* */ unsigned long long dlpi_subs; /* */ size_t dlpi_tls_modid; /* PT_TLS TLS */ void *dlpi_tls_data; /* PT_TLS */ }; ( ElfW() ELF . 32 ElfW(Addr) Elf32_Addr. .) dlpi_addr ( ). dlpi_name . dlpi_phdr dlpi_phnum ELF . dlpi_phdr . dlpi_phnum . : typedef struct { Elf32_Word p_type; /* */ Elf32_Off p_offset; /* */ Elf32_Addr p_vaddr; /* */ Elf32_Addr p_paddr; /* */ Elf32_Word p_filesz; /* */ Elf32_Word p_memsz; /* */ Elf32_Word p_flags; /* */ Elf32_Word p_align; /* */ } Elf32_Phdr; x : addr == info->dlpi_addr + info->dlpi_phdr[x].p_vaddr; p_type ( ): #define PT_LOAD 1 /* */ #define PT_DYNAMIC 2 /* */ #define PT_INTERP 3 /* */ #define PT_NOTE 4 /* */ #define PT_SHLIB 5 /* */ #define PT_PHDR 6 /* */ #define PT_TLS 7 /* */ #define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr */ #define PT_GNU_STACK 0x6474e551 /* */ #define PT_GNU_RELRO 0x6474e552 /* */ dl_iterate_phdr() callback. attributes(7). +------------+------------------------------------+--------------------+ || | | +------------+------------------------------------+--------------------+ |dl_iterate_phdr()| | MT-Safe | | | | | +------------+------------------------------------+--------------------+ dl_phdr_info . BSDs Solaris dlpi_addr dlpi_name dlpi_phdr dlpi_phnum . C dl_phdr_info size . . glibc 2.2.4. callback . dlpi_name . . ( ) ELF . x86-64. ( ) . $ ./a.out; Name: "" (9 segments) 0: [ 0x400040; memsz: 1f8] flags: 0x5; PT_PHDR 1: [ 0x400238; memsz: 1c] flags: 0x4; PT_INTERP 2: [ 0x400000; memsz: ac4] flags: 0x5; PT_LOAD 3: [ 0x600e10; memsz: 240] flags: 0x6; PT_LOAD 4: [ 0x600e28; memsz: 1d0] flags: 0x6; PT_DYNAMIC 5: [ 0x400254; memsz: 44] flags: 0x4; PT_NOTE 6: [ 0x400970; memsz: 3c] flags: 0x4; PT_GNU_EH_FRAME 7: [ (nil); memsz: 0] flags: 0x6; PT_GNU_STACK 8: [ 0x600e10; memsz: 1f0] flags: 0x4; PT_GNU_RELRO Name: "linux-vdso.so.1" (4 segments) 0: [0x7ffc6edd1000; memsz: e89] flags: 0x5; PT_LOAD 1: [0x7ffc6edd1360; memsz: 110] flags: 0x4; PT_DYNAMIC 2: [0x7ffc6edd17b0; memsz: 3c] flags: 0x4; PT_NOTE 3: [0x7ffc6edd17ec; memsz: 3c] flags: 0x4; PT_GNU_EH_FRAME Name: "/lib64/libc.so.6" (10 segments) 0: [0x7f55712ce040; memsz: 230] flags: 0x5; PT_PHDR 1: [0x7f557145b980; memsz: 1c] flags: 0x4; PT_INTERP 2: [0x7f55712ce000; memsz: 1b6a5c] flags: 0x5; PT_LOAD 3: [0x7f55716857a0; memsz: 9240] flags: 0x6; PT_LOAD 4: [0x7f5571688b80; memsz: 1f0] flags: 0x6; PT_DYNAMIC 5: [0x7f55712ce270; memsz: 44] flags: 0x4; PT_NOTE 6: [0x7f55716857a0; memsz: 78] flags: 0x4; PT_TLS 7: [0x7f557145b99c; memsz: 544c] flags: 0x4; PT_GNU_EH_FRAME 8: [0x7f55712ce000; memsz: 0] flags: 0x6; PT_GNU_STACK 9: [0x7f55716857a0; memsz: 3860] flags: 0x4; PT_GNU_RELRO Name: "/lib64/ld-linux-x86-64.so.2" (7 segments) 0: [0x7f557168f000; memsz: 20828] flags: 0x5; PT_LOAD 1: [0x7f55718afba0; memsz: 15a8] flags: 0x6; PT_LOAD 2: [0x7f55718afe10; memsz: 190] flags: 0x6; PT_DYNAMIC 3: [0x7f557168f1c8; memsz: 24] flags: 0x4; PT_NOTE 4: [0x7f55716acec4; memsz: 604] flags: 0x4; PT_GNU_EH_FRAME 5: [0x7f557168f000; memsz: 0] flags: 0x6; PT_GNU_STACK 6: [0x7f55718afba0; memsz: 460] flags: 0x4; PT_GNU_RELRO #define _GNU_SOURCE #include #include #include #include static int callback(struct dl_phdr_info *info, size_t size, void *data) { char *type; int p_type; printf("Name: \"%s\" (%d segments)\n", info->dlpi_name, info->dlpi_phnum); for (size_t j = 0; j < info->dlpi_phnum; j++) { p_type = info->dlpi_phdr[j].p_type; type = (p_type == PT_LOAD) ? "PT_LOAD" : (p_type == PT_DYNAMIC) ? "PT_DYNAMIC" : (p_type == PT_INTERP) ? "PT_INTERP" : (p_type == PT_NOTE) ? "PT_NOTE" : (p_type == PT_INTERP) ? "PT_INTERP" : (p_type == PT_PHDR) ? "PT_PHDR" : (p_type == PT_TLS) ? "PT_TLS" : (p_type == PT_GNU_EH_FRAME) ? "PT_GNU_EH_FRAME" : (p_type == PT_GNU_STACK) ? "PT_GNU_STACK" : (p_type == PT_GNU_RELRO) ? "PT_GNU_RELRO" : NULL; printf(" %2zu: [%14p; memsz:%7jx] flags: %#jx; ", j, (void *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr), (uintmax_t) info->dlpi_phdr[j].p_memsz, (uintmax_t) info->dlpi_phdr[j].p_flags); if (type != NULL) printf("%s\n", type); else printf("[other (%#x)]\n", p_type); } return 0; } int main(void) { dl_iterate_phdr(callback, NULL); exit(EXIT_SUCCESS); } ldd(1), objdump(1), readelf(1), dladdr(3), dlopen(3), elf(5), ld.so(8) . 3 . . : . 6.18 8 2026 dl_iterate_phdr(3)