return ERROR_FILEIO_OPERATION_FAILED;
}
- /* count useful segments (loadable) */
+ /* count useful segments (loadable), ignore BSS section */
image->num_sections = 0;
for (i = 0; i < elf->segment_count; i++)
- if (field32(elf, elf->segments32[i].p_type) == PT_LOAD)
+ if ((field32(elf,
+ elf->segments32[i].p_type) == PT_LOAD) &&
+ (field32(elf, elf->segments32[i].p_filesz) != 0))
image->num_sections++;
if (image->num_sections == 0) {
}
for (i = 0, j = 0; i < elf->segment_count; i++) {
- if (field32(elf, elf->segments32[i].p_type) == PT_LOAD) {
- image->sections[j].size = field32(elf, elf->segments32[i].p_memsz);
+ if ((field32(elf,
+ elf->segments32[i].p_type) == PT_LOAD) &&
+ (field32(elf, elf->segments32[i].p_filesz) != 0)) {
+ image->sections[j].size = field32(elf, elf->segments32[i].p_filesz);
if (load_to_vaddr)
image->sections[j].base_address = field32(elf,
elf->segments32[i].p_vaddr);
return ERROR_FILEIO_OPERATION_FAILED;
}
- /* count useful segments (loadable) */
+ /* count useful segments (loadable), ignore BSS section */
image->num_sections = 0;
for (i = 0; i < elf->segment_count; i++)
- if (field32(elf, elf->segments64[i].p_type) == PT_LOAD)
+ if ((field32(elf,
+ elf->segments64[i].p_type) == PT_LOAD) &&
+ (field64(elf, elf->segments64[i].p_filesz) != 0))
image->num_sections++;
if (image->num_sections == 0) {
}
for (i = 0, j = 0; i < elf->segment_count; i++) {
- if (field32(elf, elf->segments64[i].p_type) == PT_LOAD) {
- image->sections[j].size = field64(elf, elf->segments64[i].p_memsz);
+ if ((field32(elf,
+ elf->segments64[i].p_type) == PT_LOAD) &&
+ (field64(elf, elf->segments64[i].p_filesz) != 0)) {
+ image->sections[j].size = field64(elf, elf->segments64[i].p_filesz);
if (load_to_vaddr)
image->sections[j].base_address = field64(elf,
elf->segments64[i].p_vaddr);
{
struct image_elf *elf = image->type_private;
Elf32_Phdr *segment = (Elf32_Phdr *)image->sections[section].private;
- uint32_t filesz = field32(elf, segment->p_filesz);
- uint32_t memsz = field32(elf, segment->p_memsz);
size_t read_size, really_read;
int retval;
LOG_DEBUG("load segment %d at 0x%" TARGET_PRIxADDR " (sz = 0x%" PRIx32 ")", section, offset, size);
/* read initialized data in current segment if any */
- if (offset < filesz) {
+ if (offset < field32(elf, segment->p_filesz)) {
/* maximal size present in file for the current segment */
- read_size = MIN(size, filesz - offset);
+ read_size = MIN(size, field32(elf, segment->p_filesz) - offset);
LOG_DEBUG("read elf: size = 0x%zx at 0x%" TARGET_PRIxADDR "", read_size,
field32(elf, segment->p_offset) + offset);
/* read initialized area of the segment */
LOG_ERROR("cannot read ELF segment content, read failed");
return retval;
}
- buffer += read_size;
- offset += read_size;
size -= read_size;
*size_read += read_size;
/* need more data ? */
return ERROR_OK;
}
- /* clear bss in current segment if any */
- if (offset >= filesz) {
- uint32_t memset_size = MIN(size, memsz - filesz);
- memset(buffer, 0, memset_size);
- *size_read += memset_size;
- }
-
return ERROR_OK;
}
{
struct image_elf *elf = image->type_private;
Elf64_Phdr *segment = (Elf64_Phdr *)image->sections[section].private;
- uint64_t filesz = field64(elf, segment->p_filesz);
- uint64_t memsz = field64(elf, segment->p_memsz);
size_t read_size, really_read;
int retval;
LOG_DEBUG("load segment %d at 0x%" TARGET_PRIxADDR " (sz = 0x%" PRIx32 ")", section, offset, size);
/* read initialized data in current segment if any */
- if (offset < filesz) {
+ if (offset < field64(elf, segment->p_filesz)) {
/* maximal size present in file for the current segment */
- read_size = MIN(size, filesz - offset);
+ read_size = MIN(size, field64(elf, segment->p_filesz) - offset);
LOG_DEBUG("read elf: size = 0x%zx at 0x%" TARGET_PRIxADDR "", read_size,
field64(elf, segment->p_offset) + offset);
/* read initialized area of the segment */
LOG_ERROR("cannot read ELF segment content, read failed");
return retval;
}
- buffer += read_size;
- offset += read_size;
size -= read_size;
*size_read += read_size;
/* need more data ? */
return ERROR_OK;
}
- /* clear bss in current segment if any */
- if (offset >= filesz) {
- uint64_t memset_size = MIN(size, memsz - filesz);
- memset(buffer, 0, memset_size);
- *size_read += memset_size;
- }
-
return ERROR_OK;
}