On Mon, 2007-10-08 at 09:10 +0200, Carmelo AMOROSO wrote:
> Hi Folks,
> as reported into glibc bug #5104 
> (http://sourceware.org/bugzilla/show_bug.cgi?id=5104)
> 
> "
> 
> The loader does not handle symbols with the STT_COMMON type.
> 
> We (the Binutils project) are currently examining the possibilty of having the
> linker set the type of common symbols to STT_COMMON instead of STT_OBJECT. See
> the thread starting here:
> 
> http://sources.redhat.com/ml/binutils/2007-10/msg00046.html
> 
> It was pointed out however that the loader would not currently handle such
> symbols properly, so for now, the patch is not going to be applied.  It would 
> be
> good however if the loader could process such symbols, so that we might then
> allow the linker to generate them.
> 
> Cheers
>   Nick Clifton
> 
> "
> 
> the uclibc ld.so has to be updated to handle this kind of symbols with next 
> binutils release.
> This patch does it.
> 
> Regards,
> Carmelo
> 
> 
> plain text document attachment (dl_find_hash-stt_common.patch)
> Hadle STT_COMMON symbols too. Following binutils release
> will set the type of common symbols to STT_COMMON
> instead of STT_OBJECTS, so the dynamic linker needs
> to handle this type os symbols too.
> Same changes have been added to glibc (See: bugzilla #5104).
> This patch ensures the uclibc will work with later bintuils.
> 
> Signed-off-by: Carmelo Amoroso <[EMAIL PROTECTED]>
> 
> --- uClibc-trunk/ldso/ldso/dl-hash.c  2007-10-08 08:54:40.020926000 +0200
> +++ uClibc-trunk-st/ldso/ldso/dl-hash.c       2007-10-08 08:59:19.892237000 
> +0200
> @@ -177,7 +177,12 @@ char *_dl_find_hash(const char *name, st
>                               continue;
>                       if (sym->st_value == 0)
>                               continue;
> -                     if (ELF_ST_TYPE(sym->st_info) > STT_FUNC)
> +                     if (ELF_ST_TYPE(sym->st_info) > STT_FUNC
> +                     && ELF_ST_TYPE(sym->st_info) != STT_COMMON)
> +                     /* Ignore all but STT_NOTYPE, STT_OBJECT, STT_FUNC
> +                      * and STT_COMMON entries since these are no
> +                      * code/data definitions
> +                      */
>                               continue;
>                       if (_dl_strcmp(strtab + sym->st_name, name) != 0)
>                               continue;

I am good with this change. One question though: I don't think the
STT_SECTION and STT_FILE are present in a relocatable object. If this
is true(needs to be checked), then the above if stmt can be changed to:
 #define STT_RELOC_MAX STT_TLS
or 
 #define STT_RELOC_MAX STT_COMMON 
if (ELF_ST_TYPE(sym->st_info) > STT_RELOC_MAX)

or if the above assumption is true only for STT_FILE
if (ELF_ST_TYPE(sym->st_info) > STT_RELOC_MAX || ELF_ST_TYPE(sym->st_info) == 
STT_SECTION)

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

Reply via email to