[PATCH] (version 2) Change MIPS linker stubs to allow for more than 2^15 symbols.
David Daney
ddaney@avtrex.com
Fri Jun 9 19:40:00 GMT 2006
Thiemo Seufer wrote:
> David Daney wrote:
>
>>Thiemo Seufer wrote:
>>
>>>Richard Sandiford wrote:
>>>
>>>
>>>>David Daney <ddaney@avtrex.com> writes:
>>>>
>>>>
>>>>>! #define MIPS_FUNCTION_STUB_SIZE(INFO) \
>>>>>! (elf_hash_table (INFO)->dynsymcount > 65536 ? 20 : 16)
>>>>
>>>>Sorry to be a pain, but as I said earlier, I really do think we should
>>>>cache the chosen stub size in mips_elf_link_hash_table (and get rid of
>>>>this macro entirely). That will emphasise that
>>>>always_size_dynamic_sections
>>>>is the place that makes the decision, and that it's only safe to use this
>>>>value once that function has been called. I think that will be more
>>>>robust
>>>>and easier to understand in future.
>>>>
>>>>Apart from that, and from Thiemo's and Daniel's comments, this looks
>>>>really good to me. Thanks a lot for doing this!
>>>
>>>
>>>Does this followup patch look ok?
>>>
>>
>>FWIW, it looks good to me. Definitly a little cleaner than mine.
>>
>>One weird thing is that the generated code is different.
>>
>>My libgcj.so now has 16 byte stubs. With my version of the patch it
>>generated 20 byte stubs. This means that at the point you are sampling
>>info->dynsymcount, it had a different value than when it was sampled in
>>my patch. I was wondering about this because even though my patch
>>generated 20 byte stubs, none of the symbol index values in the stubs
>>were large enough to require the larger stub.
>
>
> Some of the overflow checks were off by one bit.
Your checks are identical to mine. The test for stub size is likewise
unchanged.
Look at this:
$ mipsel-linux-readelf -S libgcj.so.7.0.0
There are 40 section headers, starting at offset 0x35f82b8:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg
Lk Inf Al
[ 0] NULL 00000000 000000 000000 00
0 0 0
[ 1] .reginfo MIPS_REGINFO 000000d4 0000d4 000018 18 A
0 0 4
[ 2] .dynamic DYNAMIC 000000ec 0000ec 000120 08 A
5 0 4
[ 3] .hash HASH 0000020c 00020c 069c98 04 A
4 0 4
[ 4] .dynsym DYNSYM 00069ea4 069ea4 127210 10 A
5 17 4
.
.
.
Note the size of the .dynsym section. According to my calculations it
contains about 75553 symbols.
$ mipsel-linux-readelf -s -D libgcj.so.7.0.0 | wc
75539 679837 6082342
$ mipsel-linux-objdump -d -z -j .MIPS.stubs libgcj.so.7.0.0
libgcj.so.7.0.0: file format elf32-tradlittlemips
Disassembly of section .MIPS.stubs:
01597f30 <.MIPS.stubs>:
1597f30: 8f998010 lw t9,-32752(gp)
1597f34: 03e07821 move t7,ra
1597f38: 0320f809 jalr t9
1597f3c: 341897cc li t8,0x97cc
1597f40: 8f998010 lw t9,-32752(gp)
1597f44: 03e07821 move t7,ra
1597f48: 0320f809 jalr t9
1597f4c: 341897b1 li t8,0x97b1
1597f50: 8f998010 lw t9,-32752(gp)
1597f54: 03e07821 move t7,ra
1597f58: 0320f809 jalr t9
1597f5c: 34189761 li t8,0x9761
.
.
.
These are 16 bytes stubs, even though there are more than 2^16 dynamic
symbols. With my original patch the stubs were 20 bytes, which made
sense to me. I don't understand the discrepancy.
David Daney.
>
>
>>With your patch my simple tests with libgcj run successfully. I did
>>however see FAIL: MIPS multi-got-no-shared, which I think passed before
>>applying your patch. These are very brittle tests, so perhaps it is not
>>surprising.
>
>
> No, that's since H.J.'s COMMONPAGESIZE patch, I have a fix for that.
>
>
> Thiemo
More information about the Binutils
mailing list