Этот вопрос связан с этим, а также с его ответом.
Я только что обнаружил некоторое уродство в сборке, над которой работаю. Ситуация выглядит примерно так (написано в формате gmake); обратите внимание, это особенно относится к 32-битной модели памяти на оборудовании sparc и x86:
OBJ_SET1 := some objects
OBJ_SET2 := some objects
# note: OBJ_SET2 doesn't get this flag
${OBJ_SET1} : CCFLAGS += -PIC
${OBJ_SET1} ${OBJ_SET2} : %.o : %.cc
${CCC} ${CCFLAGS} -m32 -o ${@} -c ${<}
obj1.o : ${OBJ_SET1}
obj2.o : ${OBJ_SET2}
sharedlib.so : obj1.o obj2.o
obj1.o obj2.o sharedlib.so :
${LINK} ${LDFLAGS} -m32 -PIC -o ${@} ${^}
Ясно, что можно смешивать объекты, скомпилированные с PIC и без него, в общий объект (это используется годами). Я недостаточно знаю о PIC, чтобы понять, хорошая ли это идея / умная, и я предполагаю, что в данном случае это не нужно, а скорее это происходит потому, что кто-то не позаботился о том, чтобы найти правильный способ сделать это при лавировании о новых вещах в сборке.
Мой вопрос:
- Это безопасно?
- Это хорошая идея
- Какие потенциальные проблемы могут возникнуть в результате
- Если я переключу все на PIC, есть ли какие-нибудь неочевидные ошибки, на которые я мог бы обратить внимание.