<div dir="ltr"><div><br></div><div>In order to share more information, below is the machine instructions of the "PAL_ThrowExceptionFromContext" function including __thread variables from the CoreCLR's seh.cpp source.  I wonder why Clan/LLVM can not guarantee the normal execution of the application code including __thread variables in case of the aggressive optimization levels (e.g., -O2 and -O3)</div><div><br></div><div><br></div><div><br></div><div>========= source: __thread variable in the src/pal/src/exception/seh.cpp ===============================</div><div> * <a href="https://github.com/dotnet/coreclr/blob/08e1b2f05ba15efff366c4fd70ff475359022bb3/src/pal/src/exception/seh.cpp">https://github.com/dotnet/coreclr/blob/08e1b2f05ba15efff366c4fd70ff475359022bb3/src/pal/src/exception/seh.cpp</a> <br></div><div><br></div><div>171 --*/</div><div>172 VOID                                                                                       </div><div>173 PALAPI     </div><div>174 PAL_ThrowExceptionFromContext(CONTEXT* context, PAL_SEHException* ex)</div><div>175 {          </div><div>176     // We need to make a copy of the exception off stack, since the "ex" is located in one     of the stack</div><div>177     // frames that will become obsolete by the ThrowExceptionFromContextInternal and the Th    rowExceptionHelper</div><div>178     // could overwrite the "ex" object by stack e.g. when allocating the low level exceptio    n object for "throw".</div><div>179     static __thread BYTE threadLocalExceptionStorage[sizeof(PAL_SEHException)];</div><div>180     ThrowExceptionFromContextInternal(context, new (threadLocalExceptionStorage) PAL_SEHExc    eption(*ex));</div><div>181 } </div><div><br></div><div>========  debug: -O0  <- Build Ok, Running Success =============================================</div><div>3561791                 </div><div>3561792 0085bc14 <PAL_ThrowExceptionFromContext>:</div><div>3561793   85bc14:       b580            push    {r7, lr}</div><div>3561794   85bc16:       466f            mov     r7, sp</div><div>3561795   85bc18:       b08a            sub     sp, #40 ; 0x28</div><div>3561796   85bc1a:       460a            mov     r2, r1</div><div>3561797   85bc1c:       4603            mov     r3, r0</div><div>3561798   85bc1e:       9009            str     r0, [sp, #36]   ; 0x24</div><div>3561799   85bc20:       9108            str     r1, [sp, #32]</div><div>3561800   85bc22:       2000            movs    r0, #0</div><div>3561801   85bc24:       4601            mov     r1, r0</div><div>3561802   85bc26:       f8dd c024       ldr.w   ip, [sp, #36]   ; 0x24</div><div>3561803   85bc2a:       2800            cmp     r0, #0</div><div>3561804   85bc2c:       9207            str     r2, [sp, #28]</div><div>3561805   85bc2e:       9306            str     r3, [sp, #24]</div><div>3561806   85bc30:       f8cd c014       str.w   ip, [sp, #20]</div><div>3561807   85bc34:       9104            str     r1, [sp, #16]</div><div>3561808   85bc36:       d10d            bne.n   85bc54 <PAL_ThrowExceptionFromContext+0x40></div><div>3561809   85bc38:       e7ff            b.n     85bc3a <PAL_ThrowExceptionFromContext+0x26></div><div>3561810   85bc3a:       9908            ldr     r1, [sp, #32]</div><div>3561811   85bc3c:       480a            ldr     r0, [pc, #40]   ; (85bc68 <PAL_ThrowExceptionFromContext+0x54>)</div><div>3561812   85bc3e:       4478            add     r0, pc</div><div>3561813   85bc40:       9103            str     r1, [sp, #12]</div><div>3561814   85bc42:       f7db cf96       blx     37b70 <_init+0xb34></div><div>3561815   85bc46:       9002            str     r0, [sp, #8]</div><div>3561816   85bc48:       9903            ldr     r1, [sp, #12]</div><div>3561817   85bc4a:       f66d f1ef       bl      2c902c <_ZN16PAL_SEHExceptionC2ERKS_></div><div>3561818   85bc4e:       9802            ldr     r0, [sp, #8]</div><div>3561819   85bc50:       9004            str     r0, [sp, #16]</div><div>3561820   85bc52:       e7ff            b.n     85bc54 <PAL_ThrowExceptionFromContext+0x40></div><div>3561821   85bc54:       9804            ldr     r0, [sp, #16]</div><div>3561822   85bc56:       9905            ldr     r1, [sp, #20]</div><div>3561823   85bc58:       9001            str     r0, [sp, #4]</div><div>3561824   85bc5a:       4608            mov     r0, r1</div><div>3561825   85bc5c:       9901            ldr     r1, [sp, #4]</div><div>3561826   85bc5e:       f0aa fa47       bl      9060f0 <ThrowExceptionFromContextInternal></div><div>3561827   85bc62:       b00a            add     sp, #40 ; 0x28</div><div>3561828   85bc64:       bd80            pop     {r7, pc}</div><div>3561829   85bc66:       bf00            nop</div><div>3561830   85bc68:       00293806        .word   0x00293806</div><div>3561831                 </div><div><br></div><div><br></div><div><br></div><div>========== debug: -O1  <- Build Ok, Running Success ====================================</div><div><br></div><div>1955139                 </div><div>1955140 005103f0 <PAL_ThrowExceptionFromContext>:</div><div>1955141   5103f0:       e92d 48f0       stmdb   sp!, {r4, r5, r6, r7, fp, lr}</div><div>1955142   5103f4:       af03            add     r7, sp, #12</div><div>1955143   5103f6:       4605            mov     r5, r0</div><div>1955144   5103f8:       4807            ldr     r0, [pc, #28]   ; (510418 <PAL_ThrowExceptionFromContext+0x28>)</div><div>1955145   5103fa:       460c            mov     r4, r1</div><div>1955146   5103fc:       4478            add     r0, pc</div><div>1955147   5103fe:       f727 e06e       blx     374dc <_init+0xba0></div><div>1955148   510402:       4606            mov     r6, r0</div><div>1955149   510404:       4621            mov     r1, r4</div><div>1955150   510406:       f49f f8cf       bl      1af5a8 <_ZN16PAL_SEHExceptionC2ERKS_></div><div>1955151   51040a:       4628            mov     r0, r5</div><div>1955152   51040c:       4631            mov     r1, r6</div><div>1955153   51040e:       e8bd 48f0       ldmia.w sp!, {r4, r5, r6, r7, fp, lr}</div><div>1955154   510412:       f073 bb87       b.w     583b24 <ThrowExceptionFromContextInternal></div><div>1955155   510416:       bf00            nop</div><div>1955156   510418:       00270038        .word   0x00270038</div><div>1955157           </div><div><br></div><div>========== debug: -O2  <- Build Ok, Running Failed ======================================</div><div><br></div><div>2557238                 </div><div>2557239 006ba338 <PAL_ThrowExceptionFromContext>:</div><div>2557240   6ba338:       e92d 41f0       stmdb   sp!, {r4, r5, r6, r7, r8, lr}</div><div>2557241   6ba33c:       af03            add     r7, sp, #12</div><div>2557242   6ba33e:       4680            mov     r8, r0</div><div>2557243   6ba340:       4812            ldr     r0, [pc, #72]   ; (6ba38c <PAL_ThrowExceptionFromContext+0x54>)</div><div>2557244   6ba342:       460c            mov     r4, r1</div><div>2557245   6ba344:       4478            add     r0, pc</div><div>2557246   6ba346:       f577 e13a       blx     315bc <_init+0xca4></div><div>2557247   6ba34a:       4606            mov     r6, r0</div><div>2557248   6ba34c:       f04f 31ff       mov.w   r1, #4294967295 ; 0xffffffff</div><div>2557249   6ba350:       6031            str     r1, [r6, #0]</div><div>2557250   6ba352:       f106 000c       add.w   r0, r6, #12</div><div>2557251   6ba356:       f104 010c       add.w   r1, r4, #12</div><div>2557252   6ba35a:       2250            movs    r2, #80 ; 0x50</div><div>2557253   6ba35c:       f106 0560       add.w   r5, r6, #96     ; 0x60</div><div>2557254   6ba360:       6070            str     r0, [r6, #4]</div><div>2557255   6ba362:       60b5            str     r5, [r6, #8]</div><div>2557256   6ba364:       f576 e7ea       blx     3133c <_init+0xa24></div><div>2557257   6ba368:       f104 0160       add.w   r1, r4, #96     ; 0x60</div><div>2557258   6ba36c:       4628            mov     r0, r5</div><div>2557259   6ba36e:       f44f 72d0       mov.w   r2, #416        ; 0x1a0</div><div>2557260   6ba372:       f576 e7e4       blx     3133c <_init+0xa24></div><div>2557261   6ba376:       f8d4 0200       ldr.w   r0, [r4, #512]  ; 0x200</div><div>2557262   6ba37a:       4631            mov     r1, r6</div><div>2557263   6ba37c:       f8c6 0200       str.w   r0, [r6, #512]  ; 0x200</div><div>2557264   6ba380:       4640            mov     r0, r8</div><div>2557265   6ba382:       e8bd 41f0       ldmia.w sp!, {r4, r5, r6, r7, r8, lr}</div><div>2557266   6ba386:       f080 bd45       b.w     73ae14 <ThrowExceptionFromContextInternal></div><div>2557267   6ba38a:       bf00            nop</div><div>2557268   6ba38c:       002820e4        .word   0x002820e4</div><div>2557269                 </div><div><br></div><div><br></div><div>========== debug: -O3  <- Build Ok, Running Failed =====================================</div><div><br></div><div>2642852 006f3d54 <PAL_ThrowExceptionFromContext>:</div><div>2642853   6f3d54:       e92d 41f0       stmdb   sp!, {r4, r5, r6, r7, r8, lr}</div><div>2642854   6f3d58:       af03            add     r7, sp, #12</div><div>2642855   6f3d5a:       4680            mov     r8, r0</div><div>2642856   6f3d5c:       4812            ldr     r0, [pc, #72]   ; (6f3da8 <PAL_ThrowExceptionFromContext+0x54>)</div><div>2642857   6f3d5e:       460c            mov     r4, r1</div><div>2642858   6f3d60:       4478            add     r0, pc</div><div>2642859   6f3d62:       f53d e410       blx     31584 <_init+0xca4></div><div>2642860   6f3d66:       4606            mov     r6, r0</div><div>2642861   6f3d68:       f04f 31ff       mov.w   r1, #4294967295 ; 0xffffffff</div><div>2642862   6f3d6c:       6031            str     r1, [r6, #0]</div><div>2642863   6f3d6e:       f106 000c       add.w   r0, r6, #12</div><div>2642864   6f3d72:       f104 010c       add.w   r1, r4, #12</div><div>2642865   6f3d76:       2250            movs    r2, #80 ; 0x50</div><div>2642866   6f3d78:       f106 0560       add.w   r5, r6, #96     ; 0x60</div><div>2642867   6f3d7c:       6070            str     r0, [r6, #4]</div><div>2642868   6f3d7e:       60b5            str     r5, [r6, #8]</div><div>2642869   6f3d80:       f53d e2c0       blx     31304 <_init+0xa24></div><div>2642870   6f3d84:       f104 0160       add.w   r1, r4, #96     ; 0x60</div><div>2642871   6f3d88:       4628            mov     r0, r5</div><div>2642872   6f3d8a:       f44f 72d0       mov.w   r2, #416        ; 0x1a0</div><div>2642873   6f3d8e:       f53d e2ba       blx     31304 <_init+0xa24></div><div>2642874   6f3d92:       f8d4 0200       ldr.w   r0, [r4, #512]  ; 0x200</div><div>2642875   6f3d96:       4631            mov     r1, r6</div><div>2642876   6f3d98:       f8c6 0200       str.w   r0, [r6, #512]  ; 0x200</div><div>2642877   6f3d9c:       4640            mov     r0, r8</div><div>2642878   6f3d9e:       e8bd 41f0       ldmia.w sp!, {r4, r5, r6, r7, r8, lr}</div><div>2642879   6f3da2:       f081 bee1       b.w     775b68 <ThrowExceptionFromContextInternal></div><div>2642880   6f3da6:       bf00            nop</div><div>2642881   6f3da8:       002906c8        .word   0x002906c8</div><div><br></div><div><br></div><div>End of line. </div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 3, 2016 at 5:55 PM, Geunsik Lim <span dir="ltr"><<a href="mailto:leemgs@gmail.com" target="_blank">leemgs@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Now, There are four thread local storage (TLS) models in Clang/LLVM as following: <br>1) global-dynamic TLS model</div><div>2) local-dynamic   TLS model</div><div>3) local-exec         TLS model</div><div>4) initial-exec        TLS model <br>and emulated-TLS (for Android S/W platform)??</div><div><br></div><div>Even though, We can build run normally with the static relocation method by selecting the initial-exec TLS model instead of global-dynamic TLS model (by default) , We need to run the clang application code with global-dynamic (or local-dynamic) TLS model in order that we consider an application code is working with dlopen(3) library call. <br><br>If someone have already found the appropriate solution for some clang/LLVM applications including 1) __thread variables and 2) -O2/-O3 of the clang language, Could you share us? <br><br><br><br></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 3, 2016 at 5:14 PM, Geunsik Lim <span dir="ltr"><<a href="mailto:leemgs@gmail.com" target="_blank">leemgs@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>A few days ago, I tried to change the optimization flag from -O0 to -O2 to speed up the execution of the application on Ubuntu/ARM 14.04 32 bit. </div><div>When I compiled the source code with  -O2 flag instead of -O0 flag, I could not run the application normally by getting always the segmentation fault.</div><div><br></div><div><p style="margin-top:0px;margin-bottom:16px;color:rgb(51,51,51);font-family:'Helvetica Neue',Helvetica,'Segoe UI',Arial,freesans,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;line-height:22.4px">Here is debugging information with GDB command in case of that. As you can see, we could not execute simple hello!! console application <br>because of the bug of clang/LLVM when we try to use "static __thread" variable with -O2 flag. </p><pre style="font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:11.9px;margin-top:0px;font-stretch:normal;line-height:1.45;padding:16px;overflow:auto;border-radius:3px;word-wrap:normal;color:rgb(51,51,51);margin-bottom:0px!important;background-color:rgb(247,247,247)"><code style="font-family:Consolas,'Liberation Mono',Menlo,Courier,monospace;font-size:11.9px;padding:0px;margin:0px;border-radius:3px;border:0px;display:inline;max-width:initial;overflow:initial;line-height:inherit;word-wrap:normal;background:transparent"><b>root:/dotnet/runtime.release.20160322.2/example> gdb ../corerun  ./core.20160322</b>
GNU gdb (GDB) 7.9.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <<a href="http://gnu.org/licenses/gpl.html" target="_blank">http://gnu.org/licenses/gpl.html</a>>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "armv7l-tizen-linux-gnueabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<<a href="http://www.gnu.org/software/gdb/bugs/" target="_blank">http://www.gnu.org/software/gdb/bugs/</a>>.
Find the GDB manual and other documentation resources online at:
<<a href="http://www.gnu.org/software/gdb/documentation/" target="_blank">http://www.gnu.org/software/gdb/documentation/</a>>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ../corerun...(no debugging symbols found)...done.
[New LWP 742]
[New LWP 745]
[New LWP 744]
[New LWP 743]
[New LWP 746]

warning: File "/lib/arm-linux-gnueabihf/<a href="http://libthread_db-1.0.so" target="_blank">libthread_db-1.0.so</a>" auto-loading has been declined 
by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
To enable execution of this file add
    add-auto-load-safe-path /lib/arm-linux-gnueabihf/<a href="http://libthread_db-1.0.so" target="_blank">libthread_db-1.0.so</a>
line to your configuration file "//.gdbinit".
To completely disable this security protection add
    set auto-load safe-path /
line to your configuration file "//.gdbinit".
For more information about this security protection see the
"Auto-loading safe path" section in the GDB manual.  E.g., run from the shell:
    info "(gdb)Auto-loading safe path"

warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

warning: File "/lib/arm-linux-gnueabihf/<a href="http://libthread_db-1.0.so" target="_blank">libthread_db-1.0.so</a>" auto-loading has been declined 
by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".

warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.
---Type <return> to continue, or q <return> to quit---
Core was generated by `../corerun -c .. ./hello.exe'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x76f7a410 in __tls_get_addr () from /lib/ld-linux-armhf.so.3
(gdb) thread info
No symbol "info" in current context.
(gdb) bt
#0  0x76f7a410 in __tls_get_addr () from /lib/ld-linux-armhf.so.3
#1  0x7699787c in ClassLoader::LoadTypeHandleForTypeKey_Body(TypeKey*, TypeHandle, ClassLoadLevel) () from /dotnet/runtime.release.20160222.2/libcoreclr.so
#2  0x76994c4a in ClassLoader::LoadTypeHandleForTypeKey(TypeKey*, TypeHandle, ClassLoadLevel, InstantiationContext const*) ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#3  0x76995a38 in ClassLoader::LoadTypeDefThrowing(Module*, unsigned int, ClassLoader::NotFoundAction, ClassLoader::PermitUninstantiatedFlag, unsigned int, ClassLoadLevel, Instantiation*) ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#4  0x769939f2 in ClassLoader::LoadTypeHandleThrowing(NameHandle*, ClassLoadLevel, Module*) () from /dotnet/runtime.release.20160222.2/libcoreclr.so
#5  0x769937c2 in ClassLoader::LoadTypeByNameThrowing(Assembly*, char const*, char const*, ClassLoader::NotFoundAction, ClassLoader::LoadTypesFlag, ClassLoadLevel) () from /dotnet/runtime.release.20160222.2/libcoreclr.so
#6  0x76980918 in MscorlibBinder::LookupClass(BinderClassID) ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#7  0x769675ca in SystemDomain::LoadBaseSystemClasses() ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#8  0x769673ac in SystemDomain::Init() ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#9  0x768dbc16 in EEStartupHelper(tagCOINITEE) ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
---Type <return> to continue, or q <return> to quit--- 
#10 0x768db070 in EEStartup(tagCOINITEE) ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#11 0x768daf56 in EnsureEEStarted(tagCOINITEE) ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#12 0x76857998 in CorHost2::Start() ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#13 0x76842eac in coreclr_initialize ()
   from /dotnet/runtime.release.20160222.2/libcoreclr.so
#14 0x0000a52e in ExecuteManagedAssembly(char const*, char const*, char const*, int, char const**) ()
#15 0x00009852 in corerun(int, char const**) ()
#16 0x76d38632 in __libc_start_main () from /lib/arm-linux-gnueabihf/libc.so.6
#17 0x00009590 in _start ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) 
(gdb) 
(gdb) 
(gdb) </code></pre></div><div><br></div><div><br></div><div><div><br>At that time, I defined the "global-dynamic" TLS model by default  with  Clang/LLVM compiler as following: </div><div>SET (CMAKE_C_FLAGS_INIT                "-Wall -std=c11 -ftls-model=global-dynamic")<br><br>We can build and run hello!!! console application with clang/LLVM with -O1 optimization level for Ubuntu/ARM 14.04 32bit as following.<br></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">
src/pal/tools/clang-compiler-override.txt | 13 +++++++++++--</span><br></div><div><pre style="color:rgb(0,0,0);word-wrap:break-word;white-space:pre-wrap"> 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/pal/tools/clang-compiler-override.txt b/src/pal/tools/clang-compiler-override.txt
index 8bba4a9..ba86d15 100644
--- a/src/pal/tools/clang-compiler-override.txt
+++ b/src/pal/tools/clang-compiler-override.txt
@@ -1,13 +1,22 @@
 SET (CMAKE_C_FLAGS_INIT                "-Wall -std=c11")
 SET (CMAKE_C_FLAGS_DEBUG_INIT          "-g -O0")
 SET (CLR_C_FLAGS_CHECKED_INIT          "-g -O2")
-SET (CMAKE_C_FLAGS_RELEASE_INIT        "-g -O3")
+if(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
+    SET (CMAKE_C_FLAGS_RELEASE_INIT        "-g0 -O1")
+else()
+    SET (CMAKE_C_FLAGS_RELEASE_INIT        "-g0 -O3")
+    message(FATAL_ERROR "RELEASE... c flag no-arm")
+endif()
 SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-g -O2")
 
 SET (CMAKE_CXX_FLAGS_INIT                "-Wall -Wno-null-conversion -std=c++11")
 SET (CMAKE_CXX_FLAGS_DEBUG_INIT          "-g -O0")
 SET (CLR_CXX_FLAGS_CHECKED_INIT          "-g -O2")
-SET (CMAKE_CXX_FLAGS_RELEASE_INIT        "-g -O3")
+if(CMAKE_SYSTEM_NAME STREQUAL Linux AND CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
+    SET (CMAKE_CXX_FLAGS_RELEASE_INIT        "-g0 -O1")
+else()
+    SET (CMAKE_CXX_FLAGS_RELEASE_INIT        "-g0 -O3")
+endif()
 SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-g -O2")
 </pre></div><div>In the summary, We can build and run clang/LLVM source code including __thread variable with -O1 /-O2 flags.</div><div><br></div><div>However, We cannot run (build is okay.) normally hello!!! console application with clang/LLVM using -O2 and -O3 optimization level.<br><br></div><div>Anyone who has similar experience that gets the __thread variable issue with -O2/-O3 flags like me? </div><span><font color="#888888"><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>-- <br><div><div dir="ltr"><div><a href="http://leemgs.fedorapeople.org" style="font-family:Tahoma" target="_blank">http://leemgs.fedorapeople.org</a><span style="font-family:Tahoma"> </span></div><div>Don't try to avoid pain if you fail.<br>If you decided to face the challenges in life, <br>you can gain a lot by giving your best.<br>Cheolsang Jeong's Book & life<br>--<br></div></div></div>
</font></span></div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div><div dir="ltr"><div><a href="http://leemgs.fedorapeople.org" style="font-family:Tahoma" target="_blank">http://leemgs.fedorapeople.org</a><span style="font-family:Tahoma"> </span></div><div>Don't try to avoid pain if you fail.<br>If you decided to face the challenges in life, <br>you can gain a lot by giving your best.<br>Cheolsang Jeong's Book & life<br>--<br></div></div></div>
</div>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><a href="http://leemgs.fedorapeople.org" style="font-family:Tahoma" target="_blank">http://leemgs.fedorapeople.org</a><span style="font-family:Tahoma"> </span></div><div>Don't try to avoid pain if you fail.<br>If you decided to face the challenges in life, <br>you can gain a lot by giving your best.<br>Cheolsang Jeong's Book & life<br>--<br></div></div></div>
</div>