Страница 2 из 2

Добавлено: 08 авг 2006, 17:55
michael

Код: Выделить всё

(gdb) bt
#0  0xf75b34f7 in memset () from /usr/lib32/libc.so.6
#1  0xf7d14e35 in _nv000101gl () from ./libGLcore.so.1

Добавлено: 08 авг 2006, 18:20
ZvK
[quote="fa3a"][b]ZvK[/b], согласно линку, который я привел выше:
[quote]
Both x86 and ia64 now provide a dynamically shared object (DSO) for
system call purposes (e.g., to speed up system calls and for signal
trampoline/sigreturn purposes). At the moment, the names of these
DSOs are different:

x86: linux-vsyscall.so.1
ia64: linux-gate.so.1
[/quote]
я так понимаю, что AMD x86-64 это совсем не IA64.. может должна была грузиться linux-vsyscall.so.1? Хотя документ датирован 2003 годом..[/quote]

повторяю, оно виртуальное, оно не грузится, оно называется.

Добавлено: 08 авг 2006, 18:41
michael
fa3a писал(а): я так понимаю, что AMD x86-64 это совсем не IA64.. может должна была грузиться linux-vsyscall.so.1? Хотя документ датирован 2003 годом..
Там в конце написано
I plan to submit a patch to rename the x86 DSO to linux-gate.so.1.
Наверное, чел так и сделал, тогда с именами всё правильно. Вряд ли linux-gate.so.1 имеет отношение к моей проблеме, этот объект есть в выводе ldd для всех 32-битных приложений.

Добавлено: 09 авг 2006, 14:46
fa3a
michael, ну а судя по коре, что 32-битной, что 64-битной, коредамп у тебя происходит при вызове системной функции memset(), причем в самой же либе. И судя по всему это первый же call из libc. Поэтому есть два варианта: либо проблема в libc.so (билд кривой или еще что), либо система сама не в состоянии загрузить фунцию из динамически подгруженной шарёной библиотеки.
У меня была похожая проблема на SLES9 64bit zSeries, которая решилась исталляцией некоторых compatibility либ, а именно:

Код: Выделить всё

compat-libstdc++-33-3.2.3-47.3.s390.rpm 
Вероятно также, что OpenGL был сбилжен "неправильно". Т.е. можно копнуть и в эту сторону. Посмотреть какие параметры передавались для configure.
А может тебе стоит апгрейднуть жалезо? 8) у меня например никаких таких линукс-гейтов и в помине в output-е ldd нету 8))

Добавлено: 09 авг 2006, 15:47
michael
fa3a писал(а):michael, ну а судя по коре, что 32-битной, что 64-битной, коредамп у тебя происходит при вызове системной функции memset(), причем в самой же либе. И судя по всему это первый же call из libc. Поэтому есть два варианта: либо проблема в libc.so (билд кривой или еще что), либо система сама не в состоянии загрузить фунцию из динамически подгруженной шарёной библиотеки.
Маловероятно, что проблема именно в libc. Я тестил и на своей сборке и брал libc из ASP 10.
fa3a писал(а): У меня была похожая проблема на SLES9 64bit zSeries, которая решилась исталляцией некоторых compatibility либ, а именно:

Код: Выделить всё

compat-libstdc++-33-3.2.3-47.3.s390.rpm 
Я гляну, что это за библиотеки, может действительно поможет.
fa3a писал(а): Вероятно также, что OpenGL был сбилжен "неправильно". Т.е. можно копнуть и в эту сторону. Посмотреть какие параметры передавались для configure.
Вот это стопроцентно верно. К сожалению, на моё письмо в nvidia с просьбой предоставить исходники ответ так и не пришёл :)
fa3a писал(а): А может тебе стоит апгрейднуть жалезо? 8) у меня например никаких таких линукс-гейтов и в помине в output-е ldd нету 8))
Да куда ещё? Двухядерный Athlon64.

Добавлено: 17 авг 2006, 05:00
michael
Проблема так и не решена. compat-libstdc++ - это просто старая версия libstdc. libGL её никак не использует.

Добавлено: 17 авг 2006, 11:08
exe
Ну тогда просто посмотри что она использует.

ps. ldd libGLcore.so.1

Добавлено: 17 сен 2006, 04:11
michael
При запуске test /lib/ld.so это симлинк на ./ld.so. Впрочем, и при прямом вызове

Код: Выделить всё

LD_LIBRARY_PATH=. ./ld-2.3.4.so ./test
происходит тот же segfault.
Установка LD_ASSUME_KERNEL=2.4.1 ничего не меняет. При LD_ASSUME_KERNEL=2.3.1 программа не запускается со следующим сообщением:

./test: error while loading shared libraries: ./test: cannot open shared object file: No such file or directory

Проблема по прежнему актуальна. :(

P. S. А в чём разница между двумя библиотеками libnvidia-tls? Я пробовал использовать обе, но ситуацию это не меняет.

Добавлено: 18 сен 2006, 15:07
michael
Нет, код точно не перемешан. Дополнительные иксовые библиотеки взяты тоже из ASP'а. С флагами я не извращался. Может ли проблема быть в компиляторе или ядре? strace попробую.

Добавлено: 18 сен 2006, 16:49
michael
Спасибо за наводку на strace. Не знал о существовании такой полезной программы :oops: Вот вывод LD_LIBRARY_PATH=. ./ld-2.3.4.so ./strace ./ld-2.3.4.so ./test

Код: Выделить всё

execve("./ld-2.3.4.so", ["./ld-2.3.4.so", "./test"], [/* 27 vars */]) = 0
uname({sys="Linux", node="Michhome", ...}) = 0
brk(0)                                  = 0x55555566a000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b87872bb000
open("./test", O_RDONLY)                = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\2\0>\0\1\0\0\0\220\4@\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0700, st_size=7885, ...}) = 0
getcwd("/tmp/q/t", 128)                 = 9
mmap(0x400000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0) = 0x400000
mmap(0x500000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0) = 0x500000
close(6)                                = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("./tls/x86_64/libGL.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libGL.so.1", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("./x86_64/libGL.so.1", O_RDONLY)   = -1 ENOENT (No such file or directory)
open("./libGL.so.1", O_RDONLY)          = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\370\3\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=735336, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b87872bc000
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 1788608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b87872bd000
mprotect(0x2b8787340000, 1252032, PROT_NONE) = 0
mmap(0x2b8787440000, 200704, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x83000) = 0x2b8787440000
mmap(0x2b8787471000, 2752, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b8787471000
mprotect(0x7fff237ee000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) = 0
close(6)                                = 0
open("./tls/x86_64/libGLcore.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libGLcore.so.1", O_RDONLY)  = -1 ENOENT (No such file or directory)
open("./x86_64/libGLcore.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./libGLcore.so.1", O_RDONLY)      = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\324"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=7844032, ...}) = 0
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 8905568, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b8787472000
mprotect(0x2b8787adf000, 2167648, PROT_NONE) = 0
mmap(0x2b8787bde000, 1101824, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x66c000) = 0x2b8787bde000
mmap(0x2b8787ceb000, 21344, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b8787ceb000
close(6)                                = 0
open("./tls/x86_64/libnvidia-tls.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libnvidia-tls.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./x86_64/libnvidia-tls.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./libnvidia-tls.so.1", O_RDONLY)  = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\6\0\0\0"..., 832) = 832
lseek(6, 1812, SEEK_SET)                = 1812
read(6, "\4\0\0\0\20\0\0\0\1\0\0\0GNU\0\0\0\0\0\2\0\0\0\3\0\0\0"..., 32) = 32
fstat(6, {st_mode=S_IFREG|0755, st_size=3408, ...}) = 0
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 1050816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b8787cf1000
mprotect(0x2b8787cf2000, 1046720, PROT_NONE) = 0
mmap(0x2b8787df1000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0) = 0x2b8787df1000
close(6)                                = 0
open("./tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libc.so.6", O_RDONLY)       = -1 ENOENT (No such file or directory)
open("./x86_64/libc.so.6", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("./libc.so.6", O_RDONLY)           = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\313"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=1594224, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8787df2000
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 2303336, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b8787df3000
mprotect(0x2b8787f1c000, 1086824, PROT_NONE) = 0
mmap(0x2b878801b000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x128000) = 0x2b878801b000
mmap(0x2b8788021000, 17768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b8788021000
close(6)                                = 0
open("./tls/x86_64/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libm.so.6", O_RDONLY)       = -1 ENOENT (No such file or directory)
open("./x86_64/libm.so.6", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("./libm.so.6", O_RDONLY)           = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360=\0\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=639184, ...}) = 0
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 1593800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b8788026000
mprotect(0x2b87880ab000, 1049032, PROT_NONE) = 0
mmap(0x2b87881aa000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x84000) = 0x2b87881aa000
close(6)                                = 0
open("./tls/x86_64/libXext.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libXext.so.6", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("./x86_64/libXext.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./libXext.so.6", O_RDONLY)        = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@5\0\0\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=70112, ...}) = 0
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 1117608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b87881ac000
mprotect(0x2b87881bd000, 1047976, PROT_NONE) = 0
mmap(0x2b87882bc000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x10000) = 0x2b87882bc000
close(6)                                = 0
open("./tls/x86_64/libX11.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libX11.so.6", O_RDONLY)     = -1 ENOENT (No such file or directory)
open("./x86_64/libX11.so.6", O_RDONLY)  = -1 ENOENT (No such file or directory)
open("./libX11.so.6", O_RDONLY)         = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\230"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=1018408, ...}) = 0
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 2066976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b87882bd000
mprotect(0x2b87883b0000, 1071648, PROT_NONE) = 0
mmap(0x2b87884b0000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0xf3000) = 0x2b87884b0000
close(6)                                = 0
open("./tls/x86_64/libdl.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("./tls/libdl.so.2", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("./x86_64/libdl.so.2", O_RDONLY)   = -1 ENOENT (No such file or directory)
open("./libdl.so.2", O_RDONLY)          = 6
read(6, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\17\0"..., 832) = 832
fstat(6, {st_mode=S_IFREG|0755, st_size=17160, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b87884b6000
getcwd("/tmp/q/t", 128)                 = 9
mmap(NULL, 1056968, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b87884b7000
mprotect(0x2b87884b9000, 1048776, PROT_NONE) = 0
mmap(0x2b87885b8000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2b87885b8000
close(6)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b87885ba000
mprotect(0x2b87885b8000, 4096, PROT_READ) = 0
mprotect(0x2b87881aa000, 4096, PROT_READ) = 0
mprotect(0x2b878801b000, 16384, PROT_READ) = 0
mprotect(0x555555668000, 4096, PROT_READ) = 0
arch_prctl(ARCH_SET_FS, 0x2b87885ba6c0) = 0
brk(0)                                  = 0x55555566a000
brk(0x55555568b000)                     = 0x55555568b000
open("/dev/zero", O_RDWR)               = 6
mmap(NULL, 8192, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|0x40, 6, 0) = -1 EPERM (Operation not permitted)
mmap(NULL, 8192, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 6, 0) = -1 EPERM (Operation not permitted)
close(6)                                = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Process 821 detached
Как я понимаю, проблема в том, что не удаётся сделать mmap на /dev/zero. Я уже сталкивался с подобным: mplayer делает практически такой же вызов (только файл обычный), как последний mmap, когда грузит виндовые кодеки, и у меня он отказывался это делать. Я убрал флаг PROT_EXEC и всё заработало. Но это явно неверное решение. В чём может быть причина того, что mmap возвращает EPERM, если указан флаг PROT_EXEC? Права на /dev/zero - 777.

Добавлено: 19 сен 2006, 07:47
michael
Да, /dev действительно на tmpfs с noexec. Убрал noexec, всё заработало. Aleksey Kondratenko, огромное спасибо. Я с этой проблемой больше полугода бился.