Ладно, пока порассуждаю вслух сам:
- В uClibc, как и в glibc, внутри есть две функции - mmap и mmap64. При определении __USE_FILE_OFFSET64 вместо mmap всегда подставляется mmap64. Вопрос - как собран rTorrent?
- Даже сейчас(0.9.32) для mmap64 используется общий код libc/sysdeps/linux/common/mmap64.c который использует syscall mmap2!
- Аргумент offset в mmap имеет тип __off_t, т.е. 32-бита. Великого смысла использовать syscall mmap2 не вижу, но, в любом случае, нельзя забывать про MMAP2_PAGE_SHIFT, а в приведенных патчах этого нет!
- Если хочется для MIPS использовать syscall mmap2, самое разумное - просто удалить ссылки на libc/sysdeps/linux/mips/mmap.c
- А вот скобочки в mmap64.c расставлены неправильно, факт. Но для варианта __USE_FILE_OFFSET64 это не должно иметь значения.
Last edited by lly; 08-04-2012 at 19:35.
RT-N16 + Entware repo
С этой западноевропейской кодировкой не могу отредактировать свои сообщения. В общем, хотел сказать, что тот патч у меня не применялся, что-то не захватывал, поэтому и номера изменены. А по умолчанию, у меня этого патча нет. Проверьте файлы, действительно ли они изменены. Если да, тогда не знаю, в чем проблемы. У меня решилось с помощью этого.
Да. Проще всего посмотреть уже в бинарнике что именно используется - mmap или mmap64 с помощью nm и/или readelf.
Если mmap64, попробуй поправить только скобки:
Code:diff -uBp a/libc/sysdeps/linux/common/mmap64.c b/libc/sysdeps/linux/common/mmap64.c --- a/libc/sysdeps/linux/common/mmap64.c 2011-06-08 23:35:20.000000000 +0400 +++ b/libc/sysdeps/linux/common/mmap64.c 2012-04-08 22:47:24.000000000 +0400 @@ -61,10 +61,10 @@ __ptr_t mmap64(__ptr_t addr, size_t len, # ifdef __USE_FILE_OFFSET64 return __syscall_mmap2(addr, len, prot, flags, - fd, ((__u_quad_t) offset >> MMAP2_PAGE_SHIFT)); + fd, (__u_quad_t)(offset >> MMAP2_PAGE_SHIFT)); # else return __syscall_mmap2(addr, len, prot, flags, - fd, ((__u_long) offset >> MMAP2_PAGE_SHIFT)); + fd, (__u_long)(offset >> MMAP2_PAGE_SHIFT)); # endif }Нет конечно, из libc/sysdeps/linux/mips/Makefile.archОткуда? Из mmap64.c?
Значит мы тебя неправильно поняли. Как я уже писал, этот патч ломает mmap и, очень на то похоже, чинит mmap64 на 32-х битных платформах.
RT-N16 + Entware repo
Зачем? Всегда можно взять патч из первоисточника сразу после появления.
RT-N16 + Entware repo
Подождите, в древней libtorent 0.11.0 из Optware тоже используется mmap64, но несмотря на это никто на подобный баг никогда не жаловался:
Может, дело не в mmap64? Или баг добавился где-то при развитии mmap64.c с 0.9.28 по 0.9.32?Code:$ readelf -a /tmp/downloads/tmp/libtorrent.so.11.0.6 | grep mmap 464: 000ccaa0 196 FUNC GLOBAL DEFAULT UND mmap64 000ff534 -26476(gp) 000ccaa0 000ccaa0 FUNC UND mmap64
Last edited by ryzhov_al; 09-04-2012 at 12:39.
Именно так и есть, виноват коммит Fix arm mmap when using mmap2 syscall. Fixes bug #1303
По хронологиии всё сходится:
- uClibc 0.9.28, которую использует Optware вышла 17.08.2005г.,
- Фикс, который ты указываешь включен в код 15.05.2007г.
Следственно, в Optware этого бага действительно нет.
Last edited by ryzhov_al; 09-04-2012 at 13:38.