Index: osprey/be/com/stblock.cxx
===================================================================
--- osprey/be/com/stblock.cxx   (revision 3796)
+++ osprey/be/com/stblock.cxx   (working copy)
@@ -694,12 +694,14 @@
    *    reference to a text address.
    * 2. For preemptible symbols, we cannot use the base where the symbol
    *    is allocated since it could be preempted.
+   * 3. For PIC code, we cannot use the base if the symbol is internal,
+   *    hidden or protected symbols
    */
 #ifdef KEY
-  /* 3. For weak symbol, we cannot use the base where the symbol
+  /* 4. For weak symbol, we cannot use the base where the symbol
         is allocated since weak symbol could be defined in another file.
        (bug#3052)
-     4. For thread-local symbols, don't use the base where the symbol is
+     5. For thread-local symbols, don't use the base where the symbol is
        allocated.
    */
 #endif // KEY
@@ -709,6 +711,7 @@

   while( (ST_base(base) != base  )
         && (ST_sclass(base) != SCLASS_TEXT)
+        && !ST_is_preemptible(base)
         && !((Gen_PIC_Shared || Gen_PIC_Call_Shared) && !ST_is_export_local(base))
 #ifdef KEY
         && !ST_is_weak_symbol(base)