LINUX.ORG.RU

помогите найти откуда линкуется memcpy@GLIBC_2.14

 , ,


0

1

есть .so, из зависимостей только glibc, x86_64. нужно чтобы программа не дергала ничего из свежих версий glibc. для этого через -include подключаю файлик с кучей строчек такого вида:

__asm__(".symver __exp_finite,exp@GLIBC_2.2.5");
__asm__(".symver __acosf_finite,acosf@GLIBC_2.2.5");
__asm__(".symver __log_finite,log@GLIBC_2.2.5");
__asm__(".symver __pow_finite,pow@GLIBC_2.2.5");
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");

обычно этого достаточно, но для C++ нужно подключать libsupc++.a.

в этой либе используется memcpy, поэтому либа пропатчена, и ссылается на memcpy@GLIBC_2.2.5.

это работало до недавного времени, но я кое-что поменял в коде, и работать перестало. поменять назад нельзя, т.к. вернется серьезный баг (не имеющий отношения к проблеме).

получается вот такое:

$ readelf -Ws mylib.so | grep memcpy
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.2.5 (2)
    21: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.14 (5)
   201: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.2.5
   296: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@@GLIBC_2.14

вобщем, в подробностях рассказывать все сложно (только по запросу), но теперь собсно мой вопрос.

можно ли как-то отследить, откуда в результирующем .so появилась ссылка на memcpy@GLIBC_2.14?

известно, что в libsupc++.a нет ссылок на memcpy, есть только memcpy@GLIBC_2.14, но в результирующем .so они появляются именно после линковки этой либы.

в .so которые не используют C++ — проблем нет.

интересует, нет ли каких-нибудь логов в gcc/g++/ld, которые помогли бы обнаружить источник этого вызова.

буду признателен за любые полезные советы.

★★★★★

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

отмечаю тему как решенную, для интересующихся:

всегда проверяйте какие либы системы сборки подсовывают автоматически.

обнаружил в списке либ libgcc_eh.a, пропатчил ее аналогично libsupc++, и все заработало.

waker ★★★★★
() автор топика

это работало до недавного времени, но я кое-что поменял в коде, и работать перестало. поменять назад нельзя, т.к. вернется серьезный баг (не имеющий отношения к проблеме).

открой для себя (D)VCS.

можно ли как-то отследить, откуда в результирующем .so появилась ссылка на memcpy@GLIBC_2.14?

любители костылей типа тебя должны страдать...

И да, речь точно о memcpy(3)?

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

не переживай, гит юзаю, бисект сделал, коммит нашел, но как я написал выше - откатывать нельзя.

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

бисект сделал, коммит нашел, но как я написал выше - откатывать нельзя

ну дык не всё же нужно откатывать, посмотреть diff, и откатить именно этот косяк с либами.

А почему ты не хочешь в chroot'е собирать? Там же вроде должны дёргаться только внутренние либы, не?

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

откат одного косяка с либами приводит к другому косяку с либами. поэтому откатывать нельзя. проблема уже решена, спасибо за твои бесполезные комменты не в тему, и спокойной ночи :-)

waker ★★★★★
() автор топика
Ответ на: комментарий от no-dashi

Это конечно оффтоп, но почему бы просто статиком не собрать???

потому что в программе 48 плагинов, и линковать либу, которая есть во всех (поддерживаемых) дистрах, статиком в каждый из них — несколько расточительно, и бессмысленно.

waker ★★★★★
() автор топика

реальные пацаны собираются своим статически слинкованным тулчейном. это единственная гарантия от таких сюрпризов. и для сертификации полезно.

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

после нескольких дней самостоятельных ковыряний решил спросить помощи, и сразу нашел виновника

Всё правильно, проблема становится яснее, когда точно обозначена, или когда начнёшь ее кому-нибудь объяснять.

orm-i-auga ★★★★★
()
Ответ на: комментарий от anonymous

реальные пацаны собираются своим статически слинкованным тулчейном

тулчейн не играет роли. эта проблема фиксится либо линковкой с дремучей версией glibc (2.2.5), либо через symver и всякими ухищрениями.

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