sorting dynamic relocation entries.

Koundinya K knk@dde.dk
Mon Mar 13 03:37:00 GMT 2000


Hi Ian,
    I have not had success with this yet. Let me be more clear.

Here is a simple test case which I have choosen , where I generate a shared library
from 2 files. The library does contain dynamic relocations.

Without sorting, this is how the library looks:

Here is the section header.

[10]   SHT_REL               0x6f0      0x6f0      0x18        .rel.dyn
                   4          0          0x10       0x8        ALLOC


Here are the dynamic relocations as seen from the native dump tool. There are 3.

1) non verbose.
libruf.so:

    **** RELOCATION INFORMATION ****

.rel.dyn:
Offset     Symndx         Type

0x0             0                     0
0x40710    37                    3
0x40720    36                    3

2) in verbose

libruf.so:

    **** RELOCATION INFORMATION ****

.rel.dyn:
Offset     Symndx         Type

0x0            0              _NONE
0x40710    foo            _REL
0x40720    fun1           _REL


This is from readelf:

halfway:3654 [knk/work/hello] readelf -r libruf.so

Relocation section '.rel.dyn' at offset 0x6f0 contains 3 entries:
  Offset       Info        Type                             Symbol's Value  Symbol's
Name
  00000000  00000    R_MIPS_NONE
  00040710  02503    R_MIPS_REL32          00000000           foo
  00040720  02403    R_MIPS_REL32          00000000           fun1


After reading your earlier mail, I was more clear. I have made chages to the
comparison function called via qsort()

This is the call to qsort() in the below code

    if (info->shared)
      {
        asection *reldyn;
        bfd *dynobj1;

        dynobj1 = elf_hash_table (info)->dynobj;

        reldyn = bfd_get_section_by_name (dynobj1,
                                MIPS_ELF_REL_DYN_SECTION_NAME(dynobj1));

        if (reldyn !=NULL)
          {
                unsigned int dyn_reloc_cont;
                dyn_reloc_cont = reldyn->reloc_count;

        fprintf(stderr,"_bfd_mips_elf_final_link() Address of reldyn->contents=\
t0x%lx\n",reldyn->contents);

                 /* Perform the sort */

                qsort (reldyn->contents,
                (size_t) dyn_reloc_cont, sizeof(Elf32_External_Rel),
                        sort_dynamic_relocations);
          }
      } /********************/

/* Sort the dynamic relocations based on the symbol index. This is called
   via qsort() */

/* Note: Here for testing I am trying to print and observe the values through
fprintf's or debugger */

static int
sort_dynamic_relocations (arg1, arg2)
    const void *arg1;
    const void *arg2;
{

  const Elf32_External_Rel *rel1 = (const Elf32_External_Rel *) arg1;
  const Elf32_External_Rel *rel2 = (const Elf32_External_Rel *) arg2;

   fprintf(stderr,"sort_dynamic_relocations()
rel1(offset)=\t0x%lx\n",rel1->r_offset);
   fprintf(stderr,"sort_dynamic_relocations() rel1(info)=\t0x%lx\n",rel1->r_info);

   fprintf(stderr,"sort_dynamic_relocations()
rel2(offset)=\t0x%lx\n",rel2->r_offset);
   fprintf(stderr,"sort_dynamic_relocations() rel2(info)=\t0x%lx\n",rel2->r_info);




     /* Do the comparison and return appropriately . Not using this yet !!*/
      .....................................
      .......................................
      .........................................
  }

Well, the offset and r_info values for the relocations are printed as 0x0.

Here are are the values that I am trying to watch in the debugger and this is what
they show. rel1 and rel2 point to the exact address of each of the relocations. But
why there are no values for r_offset and r_info is sounding quite mysterious.


arg1 = 0x47f3a8
arg1 = 0x47f3b0

rel1 = 0x47f3a8
rel2 = 0x47f3b0

*rel1 = {r_offset = "",r_info=""}
*rel2 = {r_offset = "",r_info=""}

_____________________________________________________________________________

arg1 = 0x47f3b0
arg1 = 0x47f3b8

rel1 = 0x47f3b0
rel2 = 0x47f3b8

*rel1 = {r_offset = "",r_info=""}
*rel2 = {r_offset = "",r_info=""}

_____________________________________________________________________________

arg1 = 0x47f3a8
arg1 = 0x47f3b0

rel1 = 0x47f3a8
rel2 = 0x47f3b0

*rel1 = {r_offset = "",r_info=""}
*rel2 = {r_offset = "",r_info=""}



But using the debugger when I  dump the contents of memory address hat point to the
r_offset and r_info values of the relocations, I see the right values. For instance
look at the r_offset and r_info values for one of the relocs.

dump 0x47f3b0
0x0047f3b0: 0x00040710
dump 0x47f3b4
0x0047f3b4: 0x00002503

Like wise I can see the exact values for the other relocs.

But again why is it that I am not able to access these ??.

What could be wrong ??. Please suggest.

Thanks a lot.,

koundinya



More information about the Binutils mailing list