this is a operator error. Your option in the first compile invokation is inconsistent with the second. The first says (more like implied, as can be derived by IPA) you are doing call_shared. The second says you are creating a shared object, hence, IPA should never have changed the internal option passed down to call_shared. Sun
On Thu, Apr 7, 2011 at 1:34 AM, Jaewook Shin <jaewookshin...@gmail.com> wrote: > Hi Sun, > > Recently, it came to my attention that there is a bug in my patch for bug > #721. It happens with the following code example and the compilation > commands. > > $ cat bar.c > #include <stdio.h> > > void bar() > { > printf("Hello bar\n"); > return; > } > $ opencc -c -m64 -ipa -fPIC bar.c > $ opencc -shared -o bar.so bar.o -ipa > /usr/bin/ld: /tmp/bar.so.ipaSJSpVg/1.o: relocation R_X86_64_PC32 against > `.rodata_bar_so' can not be used when making a shared object; recompile with > -fPIC > /usr/bin/ld: final link failed: Bad value > Can you review my patch below? > > $ svn diff > Index: osprey/be/cg/x8664/exp_loadstore.cxx > =================================================================== > --- osprey/be/cg/x8664/exp_loadstore.cxx (revision 3537) > +++ osprey/be/cg/x8664/exp_loadstore.cxx (working copy) > @@ -1177,7 +1177,8 @@ > FmtAssert(!ST_is_thread_local(base_sym), > ("Exp_Ldst: thread-local storage should not be handled > here")); > if (Gen_PIC_Shared || Gen_PIC_Call_Shared) { > - if ( ST_is_preemptible(base_sym) ) { > + if ( (Gen_PIC_Shared && !ST_is_export_local(base_sym)) || > + (Gen_PIC_Call_Shared && ST_is_preemptible(base_sym)) ) { > TN *tmp = base_ofst == 0 ? tn : Build_TN_Like(tn); > Build_OP( TOP_ld64, tmp, Rip_TN(), > Gen_Symbol_TN( base_sym, 0, TN_RELOC_X8664_GOTPCREL ), > The bug in my earlier patch is caused by having only 'preemptible' symbols > to go into GOT, 'even for dynamically shared objects(.so files) that are > compiled with PIC'. > > In the above example, the "Hello ..." string is a read-only data and needs > not go into GOT for 'position-independent executables' if "-pie" is given to > the linker. For dynamically shared object files when they are compiled with > '-ipa', however, these read-only symbols are also placed in a separate > assembly file (symtab.s) and should be declared with ".globl" so that they > are visible outside the file. The linker seems to put all global symbols > into the GOT table if '-shared' is given to make a shared object. Thus all > accesses to the "Hello ..." string should go through GOT as well. > > The above fix is partially undoing a change in my earlier patch only for the > PIC cases. As a result, nothing changes for the PIC cases from before my > earlier patch but the CPIC cases still get the benefit of not going through > GOT for read-only data. Again, this fix is verified with both SPEC INT and > FP showing success for all but 416.games. I've reopened bug 721 for this new > issue. > > Jaewook > ------------------------------------------------------------------------------ Xperia(TM) PLAY It's a major breakthrough. An authentic gaming smartphone on the nation's most reliable network. And it wants your games. http://p.sf.net/sfu/verizon-sfdev _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel