NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

MIPS TLS relocatoin Issues in rtld


I am using NetBSD 3.1 release libraries along with the jemalloc.c file added

When i built the library and tested for MIPS arch i could see the problem
- rtld doesnot comeup since the thread specific data
   types "__thread" doesnot get relocated.
- So in the library if __thread symbol is added, rtld
  fails to relocate itself.

It is seen that the execution is aborted at function
_rtld_relocate_nonplt_self () since in the following code snippet


        for (; rel < rellim; rel++) {
                where = (void *)(relocbase + rel->r_offset);

                switch (ELF_R_TYPE(rel->r_info)) {
                case R_TYPE(NONE):

                case R_TYPE(REL32):
                        assert(ELF_R_SYM(rel->r_info) < gotsym);
                        sym = symtab + ELF_R_SYM(rel->r_info);
                        assert(ELF_ST_BIND(sym->st_info) == STB_LOCAL);
                        store_ptr(where, load_ptr(where) + relocbase);

                        abort(); <=== Here

The execution aborts at "Here" marked above.

Since the relocation type for __thread symbols is coming as
'R_MIPS_TLS_DTPMOD32'  when checked the object dump using
'readelf' but in the above code  snippet only relocations of type
'R_MIPS_REL32' and 'R_MIPS_NONE' are handled.

For other architecture (ARM,POWERPC,i386) the above problem is not seen,
since symbols of all relocations types are handled in respective

Could any one tell why only for MIPS the above switch case to relocate REL
and REL32 relocation types is used.?

The solution is to relocate all the relocation types in
libexec/ file or is there any alternative?

Thanks in Advance,

Home | Main Index | Thread Index | Old Index