Заменить функцию на стадии линковки (VS)
От: Videoman Россия https://hts.tv/
Дата: 13.10.17 09:54
Оценка:
Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией.
Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.
Re: Заменить функцию на стадии линковки (VS)
От: uzhas Ниоткуда  
Дата: 13.10.17 10:37
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией.

V>Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.

я бы посмотрел в сторону lib.exe : https://msdn.microsoft.com/ru-ru/library/e17b885t.aspx
еще может помочь dumpbin : https://docs.microsoft.com/ru-ru/cpp/build/reference/dumpbin-options
не уверен, что сработает, но можно попытаться
Re: Заменить функцию на стадии линковки (VS)
От: kov_serg Россия  
Дата: 13.10.17 13:43
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией.

V>Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.
Очень просто добавь в link опцию /force:multiple и кто был первым в списке линковки тот и будет вызываться.
Отредактировано 13.10.2017 13:51 kov_serg . Предыдущая версия . Еще …
Отредактировано 13.10.2017 13:47 kov_serg . Предыдущая версия .
Re[2]: Заменить функцию на стадии линковки (VS)
От: Videoman Россия https://hts.tv/
Дата: 14.10.17 12:47
Оценка:
Здравствуйте, uzhas, Вы писали:

U>я бы посмотрел в сторону lib.exe : https://msdn.microsoft.com/ru-ru/library/e17b885t.aspx

U>еще может помочь dumpbin : https://docs.microsoft.com/ru-ru/cpp/build/reference/dumpbin-options
U>не уверен, что сработает, но можно попытаться

Спасибо, но мне такой вариант с патчем, если я правильно понял, не подойдет. Библиотека подтягивается несколькими проектами. Хотя, есть мысль, может быть имеет смысл сделать две версии. Надо подумать.
Отредактировано 14.10.2017 18:03 Videoman . Предыдущая версия .
Re[2]: Заменить функцию на стадии линковки (VS)
От: Videoman Россия https://hts.tv/
Дата: 14.10.17 12:52
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Очень просто добавь в link опцию /force:multiple и кто был первым в списке линковки тот и будет вызываться.


Нужно будет попробовать, но видится следующая проблема: эта опция, по всей видимости, будет не избирательно действовать на всё конфликты. Интересно, неужели нельзя точно указать нужные символы, ну или имена объектников в либе которые нужно игнорировать в конкретной конфигурации.
Re[3]: Заменить функцию на стадии линковки (VS)
От: 0x7be СССР  
Дата: 14.10.17 18:09
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Спасибо, но мне такой вариант с патчем, если я правильно понял, не подойдет. Библиотека подтягивается несколькими проектами. Хотя, есть мысль, может быть имеет смысл сделать две версии. Надо подумать.

Может быть патчить "на лету" копию и подставлять её линкеру?
Re[3]: Заменить функцию на стадии линковки (VS)
От: kov_serg Россия  
Дата: 14.10.17 19:36
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, kov_serg, Вы писали:


_>>Очень просто добавь в link опцию /force:multiple и кто был первым в списке линковки тот и будет вызываться.


V>Нужно будет попробовать, но видится следующая проблема: эта опция, по всей видимости, будет не избирательно действовать на всё конфликты. Интересно, неужели нельзя точно указать нужные символы, ну или имена объектников в либе которые нужно игнорировать в конкретной конфигурации.

Не очень понимаю за что вы переживаете все конфликты он из разряда error переводит в warning.
Так что вы их всё равно увидите. Что смущает, не академичность метода?
Re[4]: Заменить функцию на стадии линковки (VS)
От: Videoman Россия https://hts.tv/
Дата: 15.10.17 19:56
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Так что вы их всё равно увидите.

За идею спасибо. Если уж совсем не будет никаких "прямых" вариантов то можно будет зафорсить.

_>Что смущает, не академичность метода?

Да. Ведь, вроде, известна библиотека, известны функции... Смущает то, что в коде с варнингами борюсь, а тут придется глаза закрывать. И еще, из опыта, всегда стараюсь избегать вещей которые зависят от порядка включения заголовков или библиотек. В будущем очень легко случайно поменять порядок и получить не рабочую dll в инсталяторе.
Re: Заменить функцию на стадии линковки (VS)
От: Дрободан Фрилич СССР  
Дата: 15.10.17 20:30
Оценка:
Videoman:

V>Допустим, есть сторонняя статическая библиотека которая экспортирует некую функцию (export "C" void Func(...)) и линкуется в DLL. Также, в эту же DLL линкуется моя статическая библиотека с такой же функцией.

V>Есть ли штатные способы указать линкеру, что бы он принудительно использовал мою версию функции (желательно под VS2013). Если нет, то что посоветуете? Интересует как подставить свою версию, а не как разрешить конфликт.

ЕМНИП, при экспорте можно задавать новые имена для символов и даже переименовывать.
Можно поиграться с ключами компилятора, линкера, c def-файлами с #pragma comment.
Имхо, задача решаемая.

ЗЫ. Вспомнил еще два способа задания линковочных алиасов.
1. ASM-файл c public, extrn и EQU (или "="?).
2. Колдовство с линковочными скриптами gcc, но это на крайний случай...
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[5]: Заменить функцию на стадии линковки (VS)
От: kov_serg Россия  
Дата: 15.10.17 20:49
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, kov_serg, Вы писали:


_>>Так что вы их всё равно увидите.

V>За идею спасибо. Если уж совсем не будет никаких "прямых" вариантов то можно будет зафорсить.
Прямые варианты длинные и менее красивые. А именно патчить obj файлы -- переименовывать или удалять функции внутри объектника (благо контрольных сумм там нету)
https://support.microsoft.com/ru-ru/help/121460/common-object-file-format-coff
http://wiki.osdev.org/COFF
http://www.benf.org/other/wumpbin/index.html
штатный dumpbin/editbin так не умеют. зато руками можно.

_>>Что смущает, не академичность метода?

V>Да. Ведь, вроде, известна библиотека, известны функции... Смущает то, что в коде с варнингами борюсь, а тут придется глаза закрывать.
Вам шашечки или ехать.

V> И еще, из опыта, всегда стараюсь избегать вещей которые зависят от порядка включения заголовков или библиотек. В будущем очень легко случайно поменять порядок и получить не рабочую dll в инсталяторе.

Не очень понимаю причем тут инсталятор. Но порядок не поменяется если явно указать объектник с подменой как первый параметр у link
link /force:multiple hack.obj ...остальное...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.