The idea I got is about removing .got section in ELF format totally. Before we go, let's see the limitation on the idea 1) It must be deployed on aligned segment model, such as Linux, which cs.start = ds.start. 2) Currently, I only know how to do on x86 ELF.
Here is a typical sample in PIC model (shared library) when library want to access its global data ... // Later code snippet template is used by gcc in almost all shared function // to imitate `mov %ip, %ebx'. call next: next: pop %ebx // << A. ... movl new_offset(%ebx), %eax // << B. load global variable foo to eax. ... .global foo // << C. OK!, to ld, offsetof(C - A) is const, and to gcc offsetof(B - A) is also const, so to aligned segment model, new_offset = offset(C - A) - offset(B - A), right? Here is the new workflow 1) Using new option, such as, new option `--segment-model=aligned' to trigger the feature. 2) Gcc creates a section (nogot) which stores data pair offsetof(B - A) and new_offset address for every function. 3) Ld reads nogot section and update new_offset according to above formular. 4) nogot section is discarded later. Constrast to traditional PIC code, we save an indirect memory load instruction and shrink memory fee by avoiding to load .got section into memory. And it seems it's fit with gcc4.5 link-time optimizer feature.