This case comes from kernel which is non-shared. It seems there is no other solutions except always addressing the preemptable variables by symbol name instead of the base + offset.
2011/11/11 Sun Chan <sun.c...@gmail.com>: > your change adds check for preemption outside of shared and call shared. In > the case of "non_shared", this does not make sense since preemption is > always in the context of dynamic objects. > Sun > > On Fri, Nov 11, 2011 at 6:01 PM, 朱庆 <zqing1...@gmail.com> wrote: >> >> Hi all, >> >> Can gatekeeper help review for a fix for bug848? >> https://bugs.open64.net/show_bug.cgi?id=848 >> >> Case: >> $cat timer.c >> #include <stdio.h> >> extern unsigned long long __attribute__((section(".data"))) jiffies_64; >> extern unsigned long volatile __attribute__((section(".data"))) jiffies; >> unsigned long volatile __attribute__((section(".data"))) jiffies=100; >> unsigned long long jiffies_64 __attribute__((__aligned__((1 << (6))))) = >> ((unsigned long)(unsigned int) (-300*1000)); >> void do_timer(unsigned long ticks) >> { >> jiffies_64 += ticks; >> } >> int main() >> { >> do_timer(1); >> printf("%d\n", jiffies_64); >> printf("%d\n", jiffies); >> } >> >> $cat a.lds: >> iffies_64 = jiffies; >> >> The problem is when link with "a.lds", the output of open64 is wrong. >> The output of jiffies_64 and jiffies should be the same according to >> the linker script. >> opencc a.lds timer.c -O0 -keep >> ./a.out >> -299999 >> 100 >> >> when compile with gcc >> ./a.out >> 101 >> 101 >> >> The root reason is in open64, the preemitable symbol is addressed >> through base and offset. >> the output of timer.s: >> # 3 extern unsigned long volatile __attribute__((section(".data"))) >> jiffies; >> # 4 unsigned long volatile __attribute__((section(".data"))) >> jiffies=100; >> # 5 unsigned long long jiffies_64 __attribute__((__aligned__((1 << >> (6))))) >> = ((unsigned long)(unsigned int) (-300*1000)); >> # 6 void do_timer(unsigned long ticks) >> # 7 { >> .LBB1_do_timer: >> pushq %rbp # >> movq %rsp,%rbp # >> addq $-32,%rsp # >> movq %rdi,-16(%rbp) # ticks >> .loc 1 8 0 >> # 8 jiffies_64 += ticks; >> movq -16(%rbp),%rdi # ticks >> movq .data(%rip),%rax # >> addq %rdi,%rax # >> movq %rax,.data(%rip) # >> leave # >> ret # >> .LDWend_do_timer: >> .size do_timer, .LDWend_do_timer-do_timer >> >> symbol jiffies_64 is represent through .data(%rip), but not >> jiffies_64(%rip), >> so when in the linker script reset the address of jiffies_64 does not >> work. >> >> The patch attached at bug848_1.patch. There is a regression caused by >> bug848_1.patch, the case is: >> >> extern void abort (void); >> >> volatile int out = 1; >> volatile int a = 2; >> volatile int b = 4; >> volatile int c = 8; >> volatile int d = 16; >> volatile int e = 32; >> volatile int f = 64; >> >> int >> main () >> { >> asm volatile ("xorl %%eax, %%eax \n\t" >> "xorl %%esi, %%esi \n\t" >> "addl %1, %0 \n\t" >> "addl %2, %0 \n\t" >> "addl %3, %0 \n\t" >> "addl %4, %0 \n\t" >> "addl %5, %0 \n\t" >> "addl %6, %0" >> : "+r" (out) >> : "r" (a), "r" (b), "r" (c), "g" (d), "g" (e), "g" (f) >> : "%eax", "%esi"); >> >> if (out != 127) >> abort (); >> >> return 0; >> } >> >> The cause is that for asm string, there is following code in fun >> "Modify_Asm_String": >> ST* st = TN_var(tn); >> Base_Symbol_And_Offset( st, &base_st, &base_ofst ); >> Base_Symbol_And_Offset does not consider whether shoud use >> base-offset or not. So I change the call to >> "Base_Symbol_And_Offset_For_Addressing". see bug848_2.patch >> >> Thanks >> zhuqing >> >> >> ------------------------------------------------------------------------------ >> RSA(R) Conference 2012 >> Save $700 by Nov 18 >> Register now >> http://p.sf.net/sfu/rsa-sfdev2dev1 >> _______________________________________________ >> Open64-devel mailing list >> Open64-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/open64-devel >> > > > ------------------------------------------------------------------------------ > RSA(R) Conference 2012 > Save $700 by Nov 18 > Register now > http://p.sf.net/sfu/rsa-sfdev2dev1 > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > > -- Regards, Lai Jian-Xin ------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel