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