getting the sh_name member in a section header elf file getting the sh_name member in a section header elf file c c

getting the sh_name member in a section header elf file


when i do printf("name offset = %d\n", (section->sh_name)); it keeps giving me 0... what am I doiing wrong?

You are not doing anything wrong.

The sh_name is not a pointer, it's an offset into .shstrtab section, which contains the actual section name.

You can find the .shstrtab section from header->e_shstrndx.

Update:

isnt it suppose to print the offset as an int?

It prints 0. What made you believe that 0 is not an int?

but of do i print the name?

Perhaps this example will explain?

#include <sys/stat.h>#include <sys/mman.h>#include <elf.h>#include <stdio.h>#include <fcntl.h>int print_shdr(const char *const fname, size_t size) {  int fd = open(fname, O_RDONLY);  char *p = mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0);  Elf32_Ehdr *ehdr = (Elf32_Ehdr*)p;  Elf32_Shdr *shdr = (Elf32_Shdr *)(p + ehdr->e_shoff);  int shnum = ehdr->e_shnum;  Elf32_Shdr *sh_strtab = &shdr[ehdr->e_shstrndx];  const char *const sh_strtab_p = p + sh_strtab->sh_offset;  for (int i = 0; i < shnum; ++i) {    printf("%2d: %4d '%s'\n", i, shdr[i].sh_name,           sh_strtab_p + shdr[i].sh_name);  }  return 0;}int main(int argc, char *argv[]){  struct stat st;  const char *fname = "/proc/self/exe";  if (argc > 1)    fname = argv[1];  if (stat(fname, &st) != 0) {    perror("stat");    return 1;  }  return print_shdr(fname, st.st_size);}$ gcc -g dump_shdr.c -m32 -std=c99$ ./a.out 0:    0 '' 1:   27 '.interp' 2:   35 '.note.ABI-tag' 3:   49 '.note.gnu.build-id' 4:   72 '.hash' 5:   68 '.gnu.hash' 6:   78 '.dynsym' 7:   86 '.dynstr' 8:   94 '.gnu.version' 9:  107 '.gnu.version_r'10:  122 '.rel.dyn'11:  131 '.rel.plt'12:  140 '.init'13:  135 '.plt'14:  146 '.text'15:  152 '.fini'16:  158 '.rodata'17:  166 '.eh_frame'18:  176 '.ctors'19:  183 '.dtors'20:  190 '.jcr'21:  195 '.dynamic'22:  204 '.got'23:  209 '.got.plt'24:  218 '.data'25:  224 '.bss'26:  229 '.comment'27:  238 '.debug_aranges'28:  253 '.debug_pubnames'29:  269 '.debug_info'30:  281 '.debug_abbrev'31:  295 '.debug_line'32:  307 '.debug_frame'33:  320 '.debug_str'34:  331 '.debug_loc'35:   17 '.shstrtab'36:    1 '.symtab'37:    9 '.strtab'