Mercurial > ecos
diff packages/services/objloader/current/src/objelf.c @ 2925:7cbaadc92c67
* services/objloader/current/src/objloader.c,
services/objloader/current/src/objelf.c
services/objloader/current/include/objelf.h: Fixed a memory leak where a
library section was loaded but memory allocated was not released. This
bug was reported by Davy Wouters on the eCos list. Added minor cosmetics
and a number of CYG_ASSERT and if() to test the values returned by
cyg_ldr_load_elf_section()
* services/objloader/current/cdl/objloader.cdl: Eliminate workarounds for
file path handling issue in obsolete Cygwin tclsh. Use ACTUAL_CFLAGS for
robustness.
* fs/rom/current/cdl/romfs.cdl: Eliminate workarounds for file path handling
issue in obsolete Cygwin tclsh. Build the mk_romfs tool with higher
priority than the custom rules which use it.
| author | jld |
|---|---|
| date | Fri, 09 Oct 2009 13:53:09 +0000 |
| parents | f8dd12428f1d |
| children | 0cc3efcba81d |
line wrap: on
line diff
--- a/packages/services/objloader/current/src/objelf.c +++ b/packages/services/objloader/current/src/objelf.c @@ -51,6 +51,7 @@ */ #include <cyg/infra/diag.h> // For diagnostic printing. +#include <cyg/infra/cyg_ass.h> #include <cyg/hal/hal_tables.h> #include <stdio.h> @@ -116,7 +117,7 @@ cyg_ldr_print_symbol_names(PELF_OBJECT p diag_printf("\n"); } -void +cyg_int32 cyg_ldr_print_rel_names(PELF_OBJECT p) { int i, j, r_entries, sym_index; @@ -135,16 +136,20 @@ cyg_ldr_print_rel_names(PELF_OBJECT p) if ((p->p_sechdr[i].sh_type == SHT_REL) || (p->p_sechdr[i].sh_type == SHT_RELA)) { - // Calculate the total number of entries in the .rela section. + // Calculate the total number of entries in the .rela/.rel section. r_entries = p->p_sechdr[i].sh_size / p->p_sechdr[i].sh_entsize; diag_printf("\n\nSymbols at: %s\n\n", p_shstrtab + p->p_sechdr[i].sh_name); #if ELF_ARCH_RELTYPE == Elf_Rela - p_rela = (Elf32_Rela*)cyg_ldr_load_elf_section(p, i); + p_rela = (Elf32_Rela *)cyg_ldr_load_elf_section(p, i); + if (p_rela == 0) + return -1; printf("Offset Info Name [+ Addend]\n"); #else - p_rel = (Elf32_Rel*)cyg_ldr_load_elf_section(p, i); + p_rel = (Elf32_Rel *)cyg_ldr_load_elf_section(p, i); + if (p_rel == 0) + return -1; printf("Offset Info Name\n"); #endif @@ -288,17 +293,21 @@ cyg_ldr_relocate_section(PELF_OBJECT p, { int i, rc; #if ELF_ARCH_RELTYPE == Elf_Rela - Elf32_Rela* p_rela = (Elf32_Rela*)cyg_ldr_load_elf_section(p, r_shndx); + Elf32_Rela *p_rela = (Elf32_Rela *)cyg_ldr_load_elf_section(p, r_shndx); + if (p_rela == 0) + return -1; #else - Elf32_Rel* p_rel = (Elf32_Rel*)cyg_ldr_load_elf_section(p, r_shndx); + Elf32_Rel *p_rel = (Elf32_Rel *)cyg_ldr_load_elf_section(p, r_shndx); + if (p_rel == 0) + return -1; #endif #if CYGPKG_SERVICES_OBJLOADER_DEBUG_LEVEL > 0 - Elf32_Sym *p_symtab = (Elf32_Sym*)cyg_ldr_section_address(p, + Elf32_Sym *p_symtab = (Elf32_Sym *)cyg_ldr_section_address(p, p->hdrndx_symtab); - char *p_strtab = (char*)cyg_ldr_section_address(p, p->hdrndx_strtab); - char *p_shstrtab = (char*)cyg_ldr_section_address(p, - p->p_elfhdr->e_shstrndx); + char *p_strtab = (char *)cyg_ldr_section_address(p, p->hdrndx_strtab); + char *p_shstrtab = (char *)cyg_ldr_section_address(p, + p->p_elfhdr->e_shstrndx); #endif // Now we can get the address of the contents of the section to modify. @@ -311,7 +320,7 @@ cyg_ldr_relocate_section(PELF_OBJECT p, p_shstrtab + p->p_sechdr[r_target_shndx].sh_name); diag_printf("----------------------------------------\n"); #if CYGPKG_SERVICES_OBJLOADER_DEBUG_LEVEL > 1 - diag_printf(" Ndx Type Offset Name\"\n"); + diag_printf(" Ndx Type Offset Name\n"); #endif #endif
