Implement xml export / import #3
@ -63,13 +63,14 @@ int elf_patch_get_bits(elfpatch_handle_t *ep);
|
|||||||
* @param ep Elfpatch handle
|
* @param ep Elfpatch handle
|
||||||
* @param[in] section section name
|
* @param[in] section section name
|
||||||
* @param[out] vma Virtual Memory Address. May be NULL.
|
* @param[out] vma Virtual Memory Address. May be NULL.
|
||||||
|
* @param[out] lma Load memory address. May be NULL.
|
||||||
* @param[out] len Size of section in bytes. May be NULL.
|
* @param[out] len Size of section in bytes. May be NULL.
|
||||||
* @return 0 if successful
|
* @return 0 if successful
|
||||||
* @return -1 if section is not found
|
* @return -1 if section is not found
|
||||||
* @return -1000 and below: Parameter error.
|
* @return -1000 and below: Parameter error.
|
||||||
*/
|
*/
|
||||||
int elf_patch_get_section_address(elfpatch_handle_t *ep, const char *section,
|
int elf_patch_get_section_address(elfpatch_handle_t *ep, const char *section,
|
||||||
uint64_t *vma, uint64_t *len);
|
uint64_t *vma, uint64_t *lma, uint64_t *len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Compute CRC over a section in an ELF file
|
* @brief Compute CRC over a section in an ELF file
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
<xs:attribute type="xs:string" name="name"/>
|
<xs:attribute type="xs:string" name="name"/>
|
||||||
<xs:attribute type="dec_hex_num" name="index"/>
|
<xs:attribute type="dec_hex_num" name="index"/>
|
||||||
<xs:attribute type="dec_hex_num" name="vma"/>
|
<xs:attribute type="dec_hex_num" name="vma"/>
|
||||||
|
<xs:attribute type="dec_hex_num" name="lma"/>
|
||||||
<xs:attribute type="dec_hex_num" name="size"/>
|
<xs:attribute type="dec_hex_num" name="size"/>
|
||||||
</xs:extension>
|
</xs:extension>
|
||||||
</xs:simpleContent>
|
</xs:simpleContent>
|
||||||
|
@ -35,6 +35,7 @@ struct elf_section {
|
|||||||
GElf_Shdr section_header;
|
GElf_Shdr section_header;
|
||||||
Elf_Scn *scn;
|
Elf_Scn *scn;
|
||||||
char *name;
|
char *name;
|
||||||
|
uint64_t lma; /**< @Resolved load memory address of a section. May be equivalent to VMA */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct elfpatch {
|
struct elfpatch {
|
||||||
@ -161,17 +162,18 @@ static void print_sections(elfpatch_handle_t *ep)
|
|||||||
|
|
||||||
/* Write header */
|
/* Write header */
|
||||||
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||||
ft_write_ln(table, "Section", "Type", "Size", "Address", "File Offset");
|
ft_write_ln(table, "Section", "Type", "Size", "VMA", "LMA", "File Offset");
|
||||||
|
|
||||||
for (iter = ep->sections; iter; iter = sl_list_next(iter)) {
|
for (iter = ep->sections; iter; iter = sl_list_next(iter)) {
|
||||||
section = (const struct elf_section *)iter->data;
|
section = (const struct elf_section *)iter->data;
|
||||||
if (!section)
|
if (!section)
|
||||||
continue;
|
continue;
|
||||||
ft_printf_ln(table, "%s|%s|%lu|0x%p|0x%p",
|
ft_printf_ln(table, "%s|%s|%lu|%p|%p|%p",
|
||||||
section->name,
|
section->name,
|
||||||
section_type_to_str(section->section_header.sh_type),
|
section_type_to_str(section->section_header.sh_type),
|
||||||
section->section_header.sh_size,
|
section->section_header.sh_size,
|
||||||
(void *)section->section_header.sh_addr,
|
(void *)section->section_header.sh_addr,
|
||||||
|
(void *)section->lma,
|
||||||
(void *)section->section_header.sh_offset
|
(void *)section->section_header.sh_offset
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -211,6 +213,10 @@ static SlList *elf_patch_get_sections(elfpatch_handle_t *ep)
|
|||||||
free(sec);
|
free(sec);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Default setting of LMA if not modified by segment */
|
||||||
|
sec->lma = (uint64_t)sec->section_header.sh_addr;
|
||||||
|
|
||||||
name = elf_strptr(ep->elf, shstrndx, sec->section_header.sh_name);
|
name = elf_strptr(ep->elf, shstrndx, sec->section_header.sh_name);
|
||||||
if (name) {
|
if (name) {
|
||||||
sec->name = strdup(name);
|
sec->name = strdup(name);
|
||||||
@ -220,8 +226,6 @@ static SlList *elf_patch_get_sections(elfpatch_handle_t *ep)
|
|||||||
|
|
||||||
ep->sections = ret;
|
ep->sections = ret;
|
||||||
|
|
||||||
print_sections(ep);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret_free_section_list:
|
ret_free_section_list:
|
||||||
@ -284,6 +288,17 @@ ret_free_err:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void resolve_section_lmas(elfpatch_handle_t *ep)
|
||||||
|
{
|
||||||
|
SlList *sec_iter;
|
||||||
|
|
||||||
|
ret_if_ep_err(ep);
|
||||||
|
|
||||||
|
for (sec_iter = ep->sections; sec_iter; sec_iter = sl_list_next(sec_iter)) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int elf_patch_update_info(elfpatch_handle_t *ep)
|
static int elf_patch_update_info(elfpatch_handle_t *ep)
|
||||||
{
|
{
|
||||||
Elf_Kind ek;
|
Elf_Kind ek;
|
||||||
@ -334,6 +349,12 @@ static int elf_patch_update_info(elfpatch_handle_t *ep)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Resolve section to segment mapping to calculate the LMA of eachs section */
|
||||||
|
resolve_section_lmas(ep);
|
||||||
|
|
||||||
|
/* Print the debug section table */
|
||||||
|
print_sections(ep);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,6 +593,15 @@ static void get_section_addr_and_length(const struct elf_section *sec, uint64_t
|
|||||||
*len = sec->section_header.sh_size;
|
*len = sec->section_header.sh_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_section_load_addr(const struct elf_section *sec, uint64_t *lma)
|
||||||
|
{
|
||||||
|
if (!sec || !lma)
|
||||||
|
return;
|
||||||
|
|
||||||
|
*lma = sec->lma;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int elf_patch_write_crcs_to_section(elfpatch_handle_t *ep, const char *section, const SlList *section_name_list,
|
int elf_patch_write_crcs_to_section(elfpatch_handle_t *ep, const char *section, const SlList *section_name_list,
|
||||||
const uint32_t *crcs, uint8_t crc_size_bits, uint32_t start_magic, uint32_t end_magic,
|
const uint32_t *crcs, uint8_t crc_size_bits, uint32_t start_magic, uint32_t end_magic,
|
||||||
bool check_start_magic, bool check_end_magic, enum crc_format format, bool little_endian)
|
bool check_start_magic, bool check_end_magic, enum crc_format format, bool little_endian)
|
||||||
@ -776,7 +806,7 @@ void elf_patch_close_and_free(elfpatch_handle_t *ep)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int elf_patch_get_section_address(elfpatch_handle_t *ep, const char *section,
|
int elf_patch_get_section_address(elfpatch_handle_t *ep, const char *section,
|
||||||
uint64_t *vma, uint64_t *len)
|
uint64_t *vma, uint64_t *lma, uint64_t *len)
|
||||||
{
|
{
|
||||||
const struct elf_section *sec;
|
const struct elf_section *sec;
|
||||||
|
|
||||||
@ -789,6 +819,7 @@ int elf_patch_get_section_address(elfpatch_handle_t *ep, const char *section,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
get_section_addr_and_length(sec, vma, len);
|
get_section_addr_and_length(sec, vma, len);
|
||||||
|
get_section_load_addr(sec, lma);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ int xml_write_crcs_to_file(const char *path, const uint32_t *crcs, SlList *secti
|
|||||||
SlList *name_iter;
|
SlList *name_iter;
|
||||||
const char *section_name;
|
const char *section_name;
|
||||||
size_t index;
|
size_t index;
|
||||||
uint64_t vma, len;
|
uint64_t vma, len, lma;
|
||||||
|
|
||||||
if (!path || !crcs || !section_name_list || !crc_params || !ep) {
|
if (!path || !crcs || !section_name_list || !crc_params || !ep) {
|
||||||
return -1000;
|
return -1000;
|
||||||
@ -76,12 +76,13 @@ int xml_write_crcs_to_file(const char *path, const uint32_t *crcs, SlList *secti
|
|||||||
xmlTextWriterStartElement(writer, BAD_CAST "crc");
|
xmlTextWriterStartElement(writer, BAD_CAST "crc");
|
||||||
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "name", "%s", section_name);
|
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "name", "%s", section_name);
|
||||||
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "index", "%zu", index);
|
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "index", "%zu", index);
|
||||||
if (elf_patch_get_section_address(ep, section_name, &vma, &len)) {
|
if (elf_patch_get_section_address(ep, section_name, &vma, &lma, &len)) {
|
||||||
print_err("Could not retrieve section address / length of section '%s'. XML output will be faulty.\n",
|
print_err("Could not retrieve section addresses / length of section '%s'. XML output will be faulty.\n",
|
||||||
section_name);
|
section_name);
|
||||||
ret |= -1;
|
ret |= -1;
|
||||||
}
|
}
|
||||||
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "vma", "0x%" PRIx64, vma);
|
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "vma", "0x%" PRIx64, vma);
|
||||||
|
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "lma", "0x%" PRIx64, lma);
|
||||||
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "size", "0x%" PRIx64, len);
|
xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "size", "0x%" PRIx64, len);
|
||||||
xmlTextWriterWriteFormatRaw(writer, "0x%" PRIx32, crcs[index]);
|
xmlTextWriterWriteFormatRaw(writer, "0x%" PRIx32, crcs[index]);
|
||||||
xmlTextWriterEndElement(writer); /* End crc */
|
xmlTextWriterEndElement(writer); /* End crc */
|
||||||
|
Loading…
Reference in New Issue
Block a user