LINUX.ORG.RU

Можно ли слинковать с исполняемым файлом?

 ,


1

2

У меня есть древний проект, который статически линовался с библиотекой из ещё более древнего проприетарного SDK. Этот SDK теперь потерян, а мне надо собрать новую версию этого проекта.

Вопрос: можно ли как-то вытащить статически слинованные символы из прошлого билда или вообще слинковать с ним как с библиотекой?

вообще слинковать с ним как с библиотекой?

Вот это вряд ли, будет ругаться на дублирующиеся функции, тот же main().

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

Да, ругается на дублирование _init (проект - динамическая библиотека) и на второй (другой) glibc: No symbol version section for versioned symbol `memcpy@@GLIBC_2.2.5'

Вот и спрашиваю может есть какой-то способ

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

С помощью objcopy можно убирать символы/секции. Не уверен на счёт memcpy, но может и с ним что-то сделает.

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

Спасибо, кажется получается с

objcopy -w -R .eh_frame -N'_*' -N'memcpy*'

Хорошо ещё что либа маленькая, если что я по одному смогу перечислить все символы что мне в ней нужны

voronaam ★★
() автор топика
Последнее исправление: voronaam (всего исправлений: 2)

Нет, в общем случае нельзя. Во-первых, если бинарник был стрипнут и нет отладочных символов, то сразу становятся неизвестны, например, адреса статически слинкованных функций. Проверить наличие имен функций из библиотеки (если они известны) можно при помощи nm. А во-вторых, даже если известны начала функций, неизвестны адреса их окончаний и адреса и размеры других объектов из либы (например, каких-нибудь глобальных static переменных), и чтобы их получить, надо по каждой функции найти, какие адреса используются и где там в дизассемблированном коде функции стоит ret.

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

В общем это примерно то как я себе это дело представляю.

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

Ааа, хитрый способ, вот так я не придумал извратиться :)

Подпишусь чтобы узнать чем дело кончилось.

Kiborg ★★★
()
Последнее исправление: Kiborg (всего исправлений: 1)

На данный момент у меня так. Если я оставляю слишком много из прошлого бинарника и убираю только те символы на которые ld ругается, то проект собрать получается, но потом он в рантайме умирает с сегфолтом.

Если я добавляю только то, на что рантайм ругается что символ не найден, то в конечном итоге прихожу к вот этому:

symbol plD1Ev, version GLIBC_2.2.5 not defined in file libc.so.6 with link time referenc

Кажется побороть иную версию glibc у меня не получится, в прошлый раз эту гадость собирали 4 года назад...

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

Судя по именам это еще и C++? Дополнительный гемор возможен. Реально задачка тоскливая:

- в статике теряется информация по relocation, это не всегда фатально для вызовов (хотя зависит от архитектуры), но фатально для обращения к общим данным. После пересборки все может плыть.

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

- С++ библиотеки сильно зависят от версии

Все аккуратно починить потенциально можно, но таки сложно. Неужели найти оный SDK или его фрагменты так трудно? Рукописи то не горят, а байты тем более.

А что там говорилось о shared-библиотеке? Тогда причем статика?

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

В общем я сдался. Интересно было попробовать, на шансов на успех было мало.

Поясню про путаницу с shared билиотекой. Код который я пытался собрать - это код shared library, который при сборке статичсески линкуется с другой библиотекой. Вот эта последняя утеряна давно, все таскали собранную годы назад разделяемую библиотеку.

На самом деле всё ещё чуть хуже. «Моя» разделяемая библиотека ещё и вызывается из Java через JNI. Так что отлаживать её чертовски неудобно.

В общем, либо мы выкидываем этот компонент вообще, либо кто-то находит таки непокоцанную версию нужного мне проприетарного SDK.

Всем спасибо за подсказки!

voronaam ★★
() автор топика
Последнее исправление: voronaam (всего исправлений: 1)
Ответ на: комментарий от voronaam

кто-то находит таки непокоцанную версию нужного мне проприетарного SDK

А это какой-то секретный SDK? А то может тут на лоре завалялся у кого, на худой конец тут есть магистры гугла и телепаты. Если, конечно, это не какой-то внутренний SDK.

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

Это ATT TTS (text-to-speach). Компания уже заплатила за их платный саппорт, так что нам должны прислать нормальный SDK скоро. Надеюсь они-то хоть его не потеряли :)

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

ATT TTS

У меня в загашнике есть какая-то проприетарная TTS библиотека, но под ARMv6. Вот такие методы в ней есть (Header'а не было, когда-то давно пытался написать его сам, вроде работало):

#ifndef VRCLIENT_H
#define VRCLIENT_H

class QString;

enum VR_PLAYTTS_T {
    Type1, // Whats mean types?
    Type2,
    Type3
};

class VRClient
{
public:
    VRClient();
    static int VR_startVR(void); /* Maybe this is VR init?
    For example, if "vr" daemon don't runing, this method run "vr" */

    static int VR_TTS_play_Text(const QString &, VR_PLAYTTS_T); // Play text in QString

    static void VR_interruptVR(void); // Stop VR playing?
    static void VR_interruptVR_ToIdle(void); // Stop VR playing?

    static VR_PLAYTTS_T VR_getVRType(void); // Get VR_PLAYTTS_T
    static int getTTSVolumn(void); // Get System Volume?
    static int VR_getVRlangType(void); // Get speaking language?

    static int SDVR_training(QString &); // Unknown. Why don't const?
    static int SDVR_confirmTraining(const QString &); // Unknown

    // What's VoiceTag? Maybe if dude speak "camera" - phone run camera app,
    // i.e "camera" - is "voicetag"?
    // also then VR_startVR() - start listen voicetags?
    static int SDVR_playVoiceTag(const QString &);
    static int SDVR_deleteVoiceTag(const QString &);
    static int SDVR_deleteAllVoiceTag(void);

    ~VRClient();
};

#endif // VRCLIENT_H
EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от EXL

Спасибо. Не ожидал что у кого-то действительно окажется TTS. Но это совсем не похоже на нашу.

Но всё равно спасибо от меня огромное за усилия по поиску.

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