Я собрал простой процесс «сборки» и «установки» для набора инструментов, унаследованных от новой работы.Сборка - это простой набор 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, чтобы изменить этот путь, чтобы он не был относительным?