Почему путь к библиотеке .so в моем исполняемом файле на Ubuntu 14.04, а не 18.04? - PullRequest
0 голосов
/ 15 июня 2019

Я собрал простой процесс «сборки» и «установки» для набора инструментов, унаследованных от новой работы.Сборка - это простой набор make-файлов, которые будут собирать каждый инструмент и помещать двоичный файл в общую папку «bin».Команда «install» копирует все бины, скрипты и библиотеки, необходимые для этого набора инструментов в «/ usr / bin / toolsuite».Когда мне нужно обновить код, я просто удаляю старую папку toolsuite и «устанавливаю» новую.Таким образом, любые обновления библиотеки, изменения кода и т. Д. Все могут обрабатываться одинаково.

Я бы хотел, чтобы этот процесс работал как в Ubuntu 18.04, так и в Ubuntu 14.04, поскольку существуют машины, использующие этот код, которые могутне переносить с 14.04 в это время (по причинам, которые не имеют прямого отношения к набору инструментов, который я обсуждаю здесь).К сожалению, 14.04, похоже, ссылается на файл проприетарной библиотеки не так, как 18.04, и я понятия не имею, как отладить.

В моем репозитории есть дюжина или около того очень простых приложений c, каждое из которых имеет make-файл (многие изих ссылка на библиотеку).Все make-файлы идентичны, за исключением спецификаций вверху файла.Вот пример:

##########################################
#           Editable options             #
##########################################

# Folders
LIBFOLDER=../../lib
INCLUDEFOLDER=../../include
BINFOLDER=../../bin
OBJFOLDER=../../objs

# Compiler options
CC=gcc
CFLAGS=-ggdb -Wall -c -I$(INCLUDEFOLDER)/tpapi -I$(INCLUDEFOLDER)
LDFLAGS=-L$(LIBFOLDER)/xxxlib -Wl,--enable-new-dtags,-rpath=/usr/bin/tool-suite/lib
LDLIBS=-l:xxxlib64.so -lrt -lpthread
EXECUTABLE_NAME=application_1

# Files
SOURCES=application_1.c

#########################################################
# Do not replace #
#########################################################
EXECUTABLES = $(EXECUTABLE_NAME:%=$(BINFOLDER)/%)
OBJECTS     = $(SOURCES:%.c=$(OBJFOLDER)/%.o)

all: $(SOURCES) $(EXECUTABLES)

$(EXECUTABLES): $(OBJECTS)
    @echo Building $<
    mkdir -p $(@D)
    $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
    @echo "Build successful!"

$(OBJECTS): $(OBJFOLDER)/%.o: %.c
    @echo Compiling $<
    mkdir -p $(@D)
    python3 ../../scripts/build_ops.py set-version
    $(CC) $(CFLAGS) -o $@ $<

.PHONY : clean
clean :
    -rm $(EXECUTABLES) $(OBJECTS)

В 18.04, когда я запускаю

readelf -d application_1

Все выглядит так, как ожидалось, xxlib64.so помечается как зависимость и абсолютный путь, по которому приложение может найти его.в моем rpath:

Dynamic section at offset 0x3cb8 contains 31 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [xxxlib64.so]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [/usr/bin/tool-suite/lib]

Но 14.04 (используя точно такой же git commit и точно такие же make-файлы) я вижу это:

  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [../../lib/xxxlib/xxxlib64.so]
 0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [/usr/bin/tool-suite/lib]

Запись xxxlib64.so в 14.04 включаетполный относительный путь того, где он был найден во время сборки.И по жизни я не могу понять, почему.Системы 14.04 были сконфигурированы другим инженером до моего времени, поэтому возможно, что они имеют какую-то странную конфигурацию.Но я не знаю, что искать, насколько странные конфигурации идут.

Я попытался установить gcc-7 из ppa ubuntu "ToolChain" и использовать ту же версию gcc, что и 18.04.Это не привело к каким-либо изменениям.

Нет ошибок во время компиляции 14.04. Ничто не указывает на то, что что-то не так.Но когда приложение пытается запустить его, оно специально пытается найти ../../xxlib64.so вместо xxlib64.so, который никогда не работает и не работает во время выполнения.

Есть ли у кого-нибудь совето том, как я буду отлаживать, почему 14.04 использует этот полный относительный путь?Или как мне выполнить «постобработку» двоичных файлов в 14.04, чтобы изменить этот путь, чтобы он не был относительным?

...