Alan Davis discovered a problem using shared libraries with textrel
symbols on nommu (C6X). He writes:

"I think I've found a bug in the dynamic loader's dynamic DSBT index
assignment. When I try to execute a program that has a textrel DSO, it
fails to load. The telltale line in the LD_DEBUG output is:

_dl_get_ready_to_run:779:       file='';  needed by './a.out'

The corresponding DT_NEEDED entry has 'libc.so.0', but here the filename
is empty. This is what is happening in _dl_elf_shared_library():

First, map all segments according to their permissions. Text gets
initially mapped read-only.

Then, parse the dynamic information. The dynamic table is in RW but some
of the tags may point to RO. For example, DT_NEEDED points to a string
in .dynstr which is in RO. These pointers get computed according to the
loadmap from the original mapping.

Then, in response to a DT_TEXTREL tag, the RO segment gets remapped,
thereby invaliding anything that points to it, in particular certain
dynamic tags such as DT_NEEDED.

I validated this by applying the following patch, which re-parses the
dynamic info after the remapping so as to re-compute any invalid
pointers. There are perhaps better solutions; perhaps split the tag
parsing into two passes, the first of which scans only for DT_TEXTREL
and then the rest can happen after remapping."


I've looked over the patch and it looks good to me. Ok to apply?


Bernd
>From 585996caa7466119716ce1f477a52bc42015946b Mon Sep 17 00:00:00 2001
From: Alan Davis <[email protected]>
Date: Thu, 26 May 2011 18:15:06 +0200
Subject: [PATCH] Correct a bug when remapping textrel segments on nommu

From: Alan Davis <[email protected]>

On C6X, when trying to execute a program that has a textrel DSO, it
fails to load. The telltale line in the LD_DEBUG output is:

_dl_get_ready_to_run:779:       file='';  needed by './a.out'

The corresponding DT_NEEDED entry has 'libc.so.0', but here the
filename is empty. This is what is happening in
_dl_elf_shared_library():

First, map all segments according to their permissions. Text gets
initially mapped read-only.

Then, parse the dynamic information. The dynamic table is in RW but
some of the tags may point to RO. For example, DT_NEEDED points to a
string in .dynstr which is in RO. These pointers get computed
according to the loadmap from the original mapping.

Then, in response to a DT_TEXTREL tag, the RO segment gets remapped,
thereby invaliding anything that points to it, in particular certain
dynamic tags such as DT_NEEDED.

The following patch re-parses the dynamic info after the remapping so
as to re-compute any invalid pointers.

Signed-off-by: Bernd Schmidt <[email protected]>
---
 ldso/ldso/dl-elf.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 7b5d751..2352fcd 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -714,6 +714,8 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
                                DL_UPDATE_LOADADDR_HDR(lib_loadaddr,
                                                       new_addr + 
(ppnt->p_vaddr & ADDR_ALIGN),
                                                       ppnt);
+                               /* Update any pointers into remapped segments.  
*/
+                               _dl_parse_dynamic_info(dpnt, dynamic_info, 
NULL, lib_loadaddr);
 #endif
                        }
                }
-- 
1.7.3.4

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to