static void set_section_command (char *args, int from_tty) { struct section_table *p; char *secname; unsigned seclen; unsigned long secaddr; char secprint[100]; long offset; if (args == 0) error (_("Must specify section name and its virtual address")); /* Parse out section name */ for (secname = args; !isspace (*args); args++); seclen = args - secname; /* Parse out new virtual address */ secaddr = parse_and_eval_address (args); for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) { if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen) && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') { offset = secaddr - p->addr; p->addr += offset; p->endaddr += offset; /* (TiEmu 20050626 Kevin Kofler) Relocate symbol file (objfile). The bad relocation API forces us to copy the entire offset table to change just that one offset. */ if (exec_objfile) { struct section_offsets *new_offsets = ((struct section_offsets *) alloca (SIZEOF_N_SECTION_OFFSETS (exec_objfile->num_sections))); memcpy (new_offsets, exec_objfile->section_offsets, SIZEOF_N_SECTION_OFFSETS (exec_objfile->num_sections)); new_offsets->offsets[p->the_bfd_section->index] += offset; objfile_relocate (exec_objfile, new_offsets); } if (from_tty) exec_files_info (&exec_ops); return; } } if (seclen >= sizeof (secprint)) seclen = sizeof (secprint) - 1; strncpy (secprint, secname, seclen); secprint[seclen] = '\0'; error (_("Section %s not found"), secprint); }
static void set_section_command (char *args, int from_tty) { struct target_section *p; char *secname; unsigned seclen; unsigned long secaddr; char secprint[100]; long offset; if (args == 0) error (_("Must specify section name and its virtual address")); /* Parse out section name */ for (secname = args; !isspace (*args); args++); seclen = args - secname; /* Parse out new virtual address */ secaddr = parse_and_eval_address (args); for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) { if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen) && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') { offset = secaddr - p->addr; p->addr += offset; p->endaddr += offset; if (from_tty) exec_files_info (&exec_ops); return; } } if (seclen >= sizeof (secprint)) seclen = sizeof (secprint) - 1; strncpy (secprint, secname, seclen); secprint[seclen] = '\0'; error (_("Section %s not found"), secprint); }