| Summary: | Падения при использовании O1 на x86_64 (dlsym) | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Product: | Sisyphus | Reporter: | Anton Farygin <rider> | ||||||
| Component: | gcc3.4 | Assignee: | Dmitry V. Levin <ldv> | ||||||
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus | ||||||
| Severity: | critical | ||||||||
| Priority: | P2 | CC: | glebfm, inger | ||||||
| Version: | unstable | ||||||||
| Hardware: | all | ||||||||
| OS: | Linux | ||||||||
| Attachments: |
|
||||||||
Created attachment 1353 [details]
test-o2-x86_64.c
Тестовый код.
Нет, это не ошибка в gcc, это либо ошибка в glibc либо неправильное использование open64. Created attachment 1355 [details]
dltest.c
Новый тест на dlsym.
$ gcc -Wall -W -Werror -O2 dltest.c -ldl -o dltest
$ ./dltest open
dlsym(open) = 0x2aaaaad70070
$ ./dltest open64
dlsym(open64) = 0x2aaaaad70100
Segmentation fault
$ ./dltest exit
dlsym(exit) = 0x2aaaaacf5c70
$
Замечу, что
1. на x86_64 нет системного вызова open64, только простой open.
2. на x86_64 cat использует библиотечную функцию open, в то время как на ix86 -
open64:
32$ ltrace cat /dev/null 2>&1 |fgrep open
open64("/dev/null", 0, 027777773360) = 3
64$ ltrace cat /dev/null 2>&1 |fgrep open
open("/dev/null", 0, 037777765230) = 3
так всё-таки, как быть ? можно конечно использовать open вместо open64 на x86_64, но что интересно: на других вызовах это не проявляется (lstat64 работает) в debian'овском переписанном fakechroot используется open64 (собирается по умолчанию без оптимизации). сегодня нарвались на: http://lists.gnu.org/archive/html/guile-devel/2006-02/msg00071.html guile18 становится действительно очень нестабильным будучи собранным с оптимизацией > 0. Дима, нам похоже нужен gcc4 , если мы хотим дистрибутив для amd64. Новый компилятор быстро не собирается... Мой тест новый компилятор прошёл. |
При сборке тестового примера с O1 падает на x86_64: gcc -O1 -ldl -Wall test-o2-x86_64.c -o test-o2-x86_64 ./test-o2-x86_64 dlvsym(open64): 0x2aaaaad70100 dlsym(open64): 0x2aaaaad70100 Segmentation fault и не падает при использовании O0: gcc -O0 -ldl -Wall test-o2-x86_64.c -o test-o2-x86_64 ./test-o2-x86_64 dlvsym(open64): 0x2aaaaad70100 dlsym(open64): 0x2aaaaad70100