Связывание один к одному в C

Есть ли способ реализовать связывание объектных файлов в C таким образом, чтобы определенные объекты могли быть только связаны друг с другом?

Например. Попытка связать Объект 1 и Объект 2 сработает и создаст работающий исполняемый файл, но попытка связать Объект 1 и Объект 3 либо вернет ошибку, либо результирующий исполняемый файл будет работать неправильно.

Справочная информация: По сути, программист А и программист Б отправляют свои объекты в компоновочную компанию. A и B хотят гарантировать, что компания Linker может только связывать свои объекты вместе, а не связывать свои объекты с объектами других программистов (например, программиста C и т. д.) (поскольку это было бы незаконно).

Ответ Йоргена Сигвардссона полезен, но мне интересно, есть ли более надежный метод. Например. При попытке связать незаконные объекты вместе с помощью gcc компоновщик может определить, какие символы требуются, и просто добавить их к незаконным объектам, легко обойдя ограничение.


person evol    schedule 23.10.2011    source источник
comment
Насколько я знаю, невозможно сделать связывание невозможным... работают ли они правильно или нет, зависит от того, как один из них использует другой...   -  person Yahia    schedule 23.10.2011
comment
могли бы вы что-то сделать, определив один и тот же символ как в obj1, так и в obj3?   -  person Jimmy    schedule 23.10.2011


Ответы (3)


Да, есть способ. В объекте 1:

extern int object_1_symbol;
int object
int object_1_symbol;
extern int object_2_symbol;
symbol;

И в объекте 2:

int object_1_symbol;
extern int object_2_symbol;

Это потребует от вас связать эти объекты вместе и не позволит вам связать его вместе с объектом 3. Это не надежно, но может послужить вашим целям.

person Jörgen Sigvardsson    schedule 23.10.2011

Нет, нет никакого способа сделать то, что вы описали.

person bmargulies    schedule 23.10.2011

Если вы хотите убедиться, что программа либо связывает и foo1.o, и foo2.o, либо ни один из них, просто объедините их в один объект:

ld -r -o foo-combined.o foo1.o foo2.o

и дать конечному пользователю только foo-combined.o

Если вы хотите добиться чего-то еще, пожалуйста, переформулируйте свой вопрос более четко.

person Employed Russian    schedule 23.10.2011