TASK_UNMAPPED_BASE

Franz Sirl Franz.Sirl-ppc at lauterbach.com
Wed Feb 4 02:22:28 EST 2004


At 14:05 03.02.2004, Joakim Tjernlund wrote:

>Hi All
>
>Currently TASK_UNMAPPED_BASE in PPC is defined to:
>#define TASK_UNMAPPED_BASE (TASK_SIZE / 8 *3) which is 0x30000000
>
>in glibc ldso's JMP_SLOT you have:
>
>       {
>         Elf32_Sword delta = finaladdr - (Elf32_Word) reloc_addr;
>         if (delta << 6 >> 6 == delta)
>           *reloc_addr = OPCODE_B (delta);
>         else if (finaladdr <= 0x01fffffc || finaladdr >= 0xfe000000)
>           *reloc_addr = OPCODE_BA (finaladdr);
>         else
>           {
>             Elf32_Word *plt, *data_words;
>             Elf32_Word index, offset, num_plt_entries;
>
>             plt = (Elf32_Word *) D_PTR (map, l_info[DT_PLTGOT]);
>             offset = reloc_addr - plt;
>
>             if (offset < PLT_DOUBLE_SIZE*2 + PLT_INITIAL_ENTRY_WORDS)
>               {
>                 index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
>                 num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val
>                                    / sizeof(Elf32_Rela));
>                 data_words = plt + PLT_DATA_START_WORDS (num_plt_entries);
>                 data_words[index] = finaladdr;
>                 reloc_addr[0] = OPCODE_LI (11, index * 4);
>                 reloc_addr[1] = OPCODE_B ((PLT_LONGBRANCH_ENTRY_WORDS
>                                            - (offset+1))
>                                           * 4);
>                 MODIFIED_CODE_NOQUEUE (reloc_addr + 1);
>               }
>             else
>               {
>                 reloc_addr[0] = OPCODE_LIS_HI (12, finaladdr);
>                 reloc_addr[1] = OPCODE_ADDI (12, 12, finaladdr);
>                 reloc_addr[2] = OPCODE_MTCTR (12);
>                 reloc_addr[3] = OPCODE_BCTR ();
>                 MODIFIED_CODE_NOQUEUE (reloc_addr + 3);
>               }
>           }
>       }
>       break;
>
>The if (delta << 6 >> 6 == delta) is commonly false.

Well, if that is true for you, then you must have a really large app, since
this covers relative branches +/-32M.

>If finaladdr is <= 0x01fffffc then the relocation is much cheaper than the
>last else statement.
>But since TASK_UNMAPPED_BASE is 0x30000000, finaladdr will never be <=
>0x01fffffc unless
>a shared library asks for a low address.

But nearly nothing loads at 0x30000000, usually only ld.so. The executable
itself (note that I haven't looked at PIE executables yet) is at 0x10000000
and the shared libs are loaded initially below that until that space is
filled and then above ld.so IIRC.

>I changed TASK_UNMAPPED_BASE to well under 0x01fffffc and it worked as well.
>
>My question: Why is TASK_UNMAPPED_BASE=0x30000000 and would changing it to
>something
>less, say 0x00100000 be a problem?

Hmm, might work, but it can also break in subtle ways, cause the shared lib
loading algorithm makes a few assumptions about the used address ranges
IIRC. But I don't see any use for it if you consider what I said above.

Franz.


** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc-dev mailing list