Смешивание PIC и не-PIC объекты в разделяемой библиотеке

Этот вопрос связан с этим , а также с ответом на него.

Я только что открыл допустил некоторую уродливость в сборке, над которой я работаю. Ситуация выглядит примерно так (написано в формате 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, чтобы понять, является ли это хорошей идеей / умной, и я предполагаю, что в данном случае это не нужно, а скорее это происходит, потому что кто-то не позаботился о том, чтобы найти правильный способ сделать это при лавировании на новые вещи в сборку.

Мой вопрос:

  1. Это безопасно
  2. Это хорошая идея
  3. Какие потенциальные проблемы могут возникнуть в результате
  4. Если я переключу все на PIC, есть ли какие-нибудь неочевидные ошибки, которые Возможно, я захочу остерегаться.

6
задан Community 23 May 2017 в 12:02
поделиться