LINUX.ORG.RU

glibc memcpy


1

1

Последнее время появились некоторые глюки, подозреваю, что причина в memcpy. Версия glibc 2.13-r2. Не хочется откатывать его целиком, с ним уже много софта собрано. Нет ли какого-либо патча для откатывания memcpy к old behavior?

Ответ на: комментарий от swagman

Сигнатуры у них одинаковые. Поэтому тривиально s/memcpy/memmove.

akk ★★★★★
()

программы надо правильно писать, ибо сказано, что при работе на перекрывающихся областях памяти поведение memcpy неопределено.
memmove, однако, медленнее.

anonymous
()

>подозреваю, что причина в memcpy

Не надо подозревать, дебаггер в руки.

anonymous
()
Ответ на: комментарий от swagman

> Примерно это я и хочу сделать, но как конкретно?

sed -i s/memcpy/memmove/g source.c

arsi ★★★★★
()
Ответ на: комментарий от anonymous

Так, в общем дурная голова не даёт покоя всему телу. Сперва пропатчил glibc федоровским патчем для memcpy через memmove, когда не помогло сделал

grep -l memcpy -r * | grep -v svn | while read i; do sed -i 's/memcpy/memmove/g' ${i}; done
на исходниках проги, и когда и это не помогло, добрался до дебагера и выяснил, что проблема не в memcpy, а вообще в strcpy, в коде вроде такого
  strcpy (p, p + 2);
И как-то не видно тривиального способа ее решить :( Хотелось бы не патчить прогу, а сделать для нее аналог mymemcpy.so. Но пока не осиливаю тамошний ад и ассемблер.

swagman
() автор топика
Ответ на: комментарий от swagman

То есть как не видно способа решить??? У меня из-за подобного кода оригинальный Урбан Террор не запускается и приходится его код исправлять.

Оригинальный код, удаляющий первый символ в строке

strcpy(p, p + 1);
заменяю на
memmove(p, p + 1, strlen(p));

anonymous
()
Ответ на: комментарий от anonymous

Интересно, у меня urbanterror запускается вроде без плясок. Наверное, если пересобрать, то сломается. Надо будет попробовать менять strcpy на memmove, а насчет того, что не видно способа тут проблема в том, что там сотни раз вызывается strcpy, и руками править долго, а скриптом страшновато, там разные случаи. Сделать его отдельной либой и подгружать по LD_PRELOAD было бы гораздо проще.

swagman
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Чтоб его использовать, надо сперва либу собрать, и непонятно, где ее взять неоптимизированную. Вот memcpy добрый Линус выложил, и все счастливы, а strcpy неясно где брать.

swagman
() автор топика
Ответ на: комментарий от uzbl

Вообще-то да, реализация strcpy приводится в K&R в главе посвященной строкам и указателям.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от anonymous

Вообще, разговор шёл как раз про

где ее взять неоптимизированную


но ананизмусы тред не читают, ага.

uzbl
()
Ответ на: комментарий от swagman

stpcpy в gcc это built-in функция. Наверное, для LD_PRELOAD нужно будет компилить с -fno-builtin.

ИМХО, костыливание ошибок это не выход, лучше найти, где неправильно.

mky ★★★★★
()
Ответ на: комментарий от uzbl

Взял код с вики, спасибо. Как-то я заморочился пытаясь понять, как оно сделано в glibc'е, а там сплошной asm, и не подумал о более простом решении. Вроде всё заработало, ура!

З.Ы. компилил без -fno-builtin.

LANG= gcc -O2 -c strcpy.c 
ld -G strcpy.o -o mystrcpy.so

swagman
() автор топика
17 мая 2012 г.
Ответ на: комментарий от uzbl

И года не прошло, как враги из википедии выпилили эту замечательную статью. Явно они заодно с майнтейнерами glibc.

swagman
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.