diff -Nrup uclinux-cvs/elf2flt/elf2flt.c elf2flt-20041205/elf2flt.c
--- uclinux-cvs/elf2flt/elf2flt.c	2004-11-17 02:16:03.000000000 +0100
+++ elf2flt-20041205/elf2flt.c	2005-01-16 01:26:24.000000000 +0100
@@ -1531,6 +1531,8 @@ int main(int argc, char *argv[])
   /* Group output sections into text, data, and bss, and calc their sizes.  */
   for (s = abs_bfd->sections; s != NULL; s = s->next) {
     unsigned long *vma, *len;
+    bfd_size_type sec_size;
+    bfd_vma sec_vma;
 
     if (s->flags & SEC_CODE) {
       vma = &text_vma;
@@ -1544,14 +1546,17 @@ int main(int argc, char *argv[])
     } else
       continue;
 
-    if (s->vma < *vma) {
+    sec_size = bfd_section_size(abs_bfd, s);
+    sec_vma  = bfd_section_vma(abs_bfd, s);
+
+    if (sec_vma < *vma) {
       if (*len > 0)
-	*len += s->vma - *vma;
+	*len += sec_vma - *vma;
       else
-	*len = s->_raw_size;
-      *vma = s->vma;
-    } else if (s->vma + s->_raw_size > *vma + *len)
-      *len = s->vma + s->_raw_size - *vma;
+	*len = sec_size;
+      *vma = sec_vma;
+    } else if (sec_vma + sec_size > *vma + *len)
+      *len = sec_vma + sec_size - *vma;
   }
 
   if (text_len == 0) {
@@ -1569,7 +1574,7 @@ int main(int argc, char *argv[])
     if (s->flags & SEC_CODE) 
       if (!bfd_get_section_contents(abs_bfd, s,
 				   text + (s->vma - text_vma), 0,
-				   s->_raw_size))
+				   bfd_section_size(abs_bfd, s)))
       {
 	fprintf(stderr, "read error section %s\n", s->name);
 	exit(2);
@@ -1600,7 +1605,7 @@ int main(int argc, char *argv[])
     if (s->flags & SEC_DATA) 
       if (!bfd_get_section_contents(abs_bfd, s,
 				   data + (s->vma - data_vma), 0,
-				   s->_raw_size))
+				   bfd_section_size(abs_bfd, s)))
       {
 	fprintf(stderr, "read error section %s\n", s->name);
 	exit(2);
