sigsegv11

Untitled

May 4th, 2012
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. wangbj@localhost ~/test $ ghci -v
  2. GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
  3. Glasgow Haskell Compiler, Version 7.4.1, stage 2 booted by GHC version 7.4.1
  4. Using binary package database: /usr/lib64/ghc-7.4.1/package.conf.d/package.cache
  5. hiding package time-1.4 to avoid conflict with later version time-1.4.0.1
  6. wired-in package ghc-prim mapped to ghc-prim-0.2.0.0-c2ff696e5b8ec4d4b2bc2e42085fe471
  7. wired-in package integer-gmp mapped to integer-gmp-0.4.0.0-3cccac07aef8e27023f605c1f45bdf74
  8. wired-in package base mapped to base-4.5.0.0-40b99d05fae6a4eea95ea69e6e0c9702
  9. wired-in package rts mapped to builtin_rts
  10. wired-in package template-haskell mapped to template-haskell-2.7.0.0-8c8cd20e21666657195efabced685fe1
  11. wired-in package dph-seq not found.
  12. wired-in package dph-par not found.
  13. Hsc static flags: -static
  14. Loading package ghc-prim ... linking ... done.
  15. *** gcc:
  16. 'gcc' '-fno-stack-protector' '-Wl,--hash-size=31' '-Wl,--reduce-memory-overheads' '-L/usr/lib64/ghc-7.4.1/integer-gmp-0.4.0.0' '--print-file-name' 'libgmp.so'
  17. Loading package integer-gmp ... linking ... done.
  18. Loading package base ... linking ... ghc: /usr/lib64/ghc-7.4.1/base-4.5.0.0/HSbase-4.5.0.0.o: unknown symbol `stat'
  19. *** Deleting temp files:
  20. Deleting:
  21. *** Deleting temp dirs:
  22. Deleting:
  23. ghc: unable to load package `base'
  24. wangbj@localhost ~/test $
  25.  
  26.  
  27.  
  28. I create a simple program for testing ``stat'':
  29.  
  30. $ cat ex98.c
  31. #include <sys/types.h>
  32. #include <sys/stat.h>
  33.  
  34. #include <stdio.h>
  35.  
  36. int main(int argc, char* argv[])
  37. {
  38. struct stat st;
  39.  
  40. stat (argv[0], &st);
  41.  
  42. return 0;
  43. }
  44.  
  45.  
  46. $ readelf -s ex98 | grep stat
  47. 4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __xstat@GLIBC_2.2.5 (2)
  48. 39: 0000000000400670 16 FUNC GLOBAL HIDDEN 13 __stat
  49. 40: 0000000000400670 16 FUNC WEAK HIDDEN 13 stat
  50. 43: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __xstat@@GLIBC_2.2.5
  51.  
  52. GLIBC (2.15) don't have symbol for function ``stat'' (or __stat):
  53.  
  54. wangbj@localhost ~/test $ readelf -s /lib64/libc.so.6 | grep 'stat\>'
  55. 65: 0000000000077730 16 FUNC GLOBAL DEFAULT 12 _IO_file_stat@@GLIBC_2.2.5
  56. 452: 00000000000dc8d0 69 FUNC GLOBAL DEFAULT 12 __lxstat@@GLIBC_2.2.5
  57. 1466: 00000000000dc880 69 FUNC GLOBAL DEFAULT 12 __fxstat@@GLIBC_2.2.5
  58. 1513: 00000000000ea300 69 FUNC GLOBAL DEFAULT 12 ustat@@GLIBC_2.2.5
  59. 1929: 00000000000dc830 69 FUNC GLOBAL DEFAULT 12 __xstat@@GLIBC_2.2.5
  60.  
  61. If I objdump ex98:
  62.  
  63. 0000000000400594 <main>:
  64. 400594: 55 push %rbp
  65. 400595: 48 89 e5 mov %rsp,%rbp
  66. 400598: 48 81 ec a0 00 00 00 sub $0xa0,%rsp
  67. 40059f: 89 bd 6c ff ff ff mov %edi,-0x94(%rbp)
  68. 4005a5: 48 89 b5 60 ff ff ff mov %rsi,-0xa0(%rbp)
  69. 4005ac: 48 8b 85 60 ff ff ff mov -0xa0(%rbp),%rax
  70. 4005b3: 48 8b 00 mov (%rax),%rax
  71. 4005b6: 48 8d 95 70 ff ff ff lea -0x90(%rbp),%rdx
  72. 4005bd: 48 89 d6 mov %rdx,%rsi
  73. 4005c0: 48 89 c7 mov %rax,%rdi
  74. 4005c3: e8 a8 00 00 00 callq 400670 <__stat>
  75. 4005c8: b8 00 00 00 00 mov $0x0,%eax
  76. 4005cd: c9 leaveq
  77. 4005ce: c3 retq
  78. 4005cf: 90 nop
  79.  
  80. ...
  81.  
  82.  
  83. 0000000000400670 <__stat>:
  84. 400670: 48 89 f2 mov %rsi,%rdx
  85. 400673: 48 89 fe mov %rdi,%rsi
  86. 400676: bf 01 00 00 00 mov $0x1,%edi
  87. 40067b: e9 20 fe ff ff jmpq 4004a0 <__xstat@plt>
  88. 400680: 55 push %rbp
  89. 400681: 48 89 e5 mov %rsp,%rbp
  90. 400684: 53 push %rbx
  91. 400685: 48 83 ec 08 sub $0x8,%rsp
  92. 400689: 48 8b 05 58 07 20 00 mov 0x200758(%rip),%rax # 600de8 <__init_array_end+0x4>
  93. 400690: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
  94. 400694: 74 19 je 4006af <__stat+0x3f>
  95. 400696: bb e8 0d 60 00 mov $0x600de8,%ebx
  96. 40069b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
  97. 4006a0: 48 83 eb 08 sub $0x8,%rbx
  98. 4006a4: ff d0 callq *%rax
  99. 4006a6: 48 8b 03 mov (%rbx),%rax
  100. 4006a9: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
  101. 4006ad: 75 f1 jne 4006a0 <__stat+0x30>
  102. 4006af: 48 83 c4 08 add $0x8,%rsp
  103. 4006b3: 5b pop %rbx
  104. 4006b4: c9 leaveq
  105. 4006b5: c3 retq
  106. 4006b6: 90 nop
  107. 4006b7: 90 nop
  108.  
  109.  
  110. So it seems GCC will create its own stat, and will call __xstat@plt from glibc, not the plain ``stat''.
  111.  
  112. in /usr/include/sys/stat.h:
  113.  
  114. #if defined __GNUC__ && __GNUC__ >= 2 && defined __USE_EXTERN_INLINES
  115. /* Inlined versions of the real stat and mknod functions. */
  116.  
  117. __extern_inline int
  118. __NTH (stat (__const char *__path, struct stat *__statbuf))
  119. {
  120. return __xstat (_STAT_VER, __path, __statbuf);
  121. }
  122.  
  123. So it should be an error that HSbase.o linked agaist ``stat'' directly?
Advertisement
Add Comment
Please, Sign In to add comment