LINUX.ORG.RU

Почему не работает -static компиляция?

 ,


0

2

Подскажите, почему такое может быть. Собираю 64 битный эльф с помощью GCC, ключи такие:

CXX      := /usr/bin/x86_64-linux-gnu-g++
CC       := /usr/bin/x86_64-linux-gnu-gcc
CXXFLAGS :=  -pthread -static -std=gnu99   $(Preprocessors)
CFLAGS   := -pthread -static -std=gnu99   $(Preprocessors)
Все равно получается не-статик, потому что ldd показывает зависимость от библиотек. Собираю на убунте, а на центосе не работает.

Что я делаю не так?

Покажи строчку вызова gcc, по желанию можно и с -v флагом, и что за ошибка.

-static это для LDFLAGS.

xaizek прав, но внутри вызова gcc зовется непосредственно компилятор и линкер, поэтому нужно понимать, что и как и итоге собирается.

anonymous
()
Ответ на: комментарий от anonymous

Я не особо разбираюсь в make-файлах, он сгенерирован IDE CodeLite, просто передаю туда -static в опции компилера.. Там много текста вида

##
## Auto Generated makefile by CodeLite IDE
## any manual changes will be erased      
##
## Release
ProjectName            :=loto
ConfigurationName      :=Release
ProjectPath            :=.
IntermediateDirectory  :=./Release
OutDir                 := $(IntermediateDirectory)
CurrentFileName        :=
CurrentFilePath        :=
CurrentFileFullPath    :=
User                   :=user
Date                   :=04/27/21
CodeLitePath           :=/home/user/.codelite
LinkerName             :=/usr/bin/x86_64-linux-gnu-g++
SharedObjectLinkerName :=/usr/bin/x86_64-linux-gnu-g++ -shared -fPIC
ObjectSuffix           :=.o
DependSuffix           :=.o.d
PreprocessSuffix       :=.i
DebugSwitch            :=-g 
IncludeSwitch          :=-I
LibrarySwitch          :=-l
OutputSwitch           :=-o 
LibraryPathSwitch      :=-L
PreprocessorSwitch     :=-D
SourceSwitch           :=-c 
OutputFile             :=$(IntermediateDirectory)/$(ProjectName)
Preprocessors          :=
ObjectSwitch           :=-o 
ArchiveOutputSwitch    := 
PreprocessOnlySwitch   :=-E
ObjectsFileList        :="loto.txt"
PCHCompileFlags        :=
MakeDirCommand         :=mkdir -p
LinkOptions            :=  -pthread -static -std=gnu99 
IncludePath            :=  $(IncludeSwitch). $(IncludeSwitch). 
IncludePCH             := 
RcIncludePath          := 
Libs                   := 
ArLibs                 :=  
LibPath                := $(LibraryPathSwitch). 

##
## Common variables
## AR, CXX, CC, AS, CXXFLAGS and CFLAGS can be overriden using an environment variables
##
AR       := /usr/bin/x86_64-linux-gnu-ar rcu
CXX      := /usr/bin/x86_64-linux-gnu-g++
CC       := /usr/bin/x86_64-linux-gnu-gcc
CXXFLAGS :=  -pthread -static -std=gnu99   $(Preprocessors)
CFLAGS   := -pthread -static -std=gnu99   $(Preprocessors)
ASFLAGS  := 
AS       := /usr/bin/x86_64-linux-gnu-as


##
## User defined environment variables
##
CodeLiteDir:=/usr/share/codelite
Objects0=$(IntermediateDirectory)/main.c$(ObjectSuffix) $(IntermediateDirectory)/str.c$(ObjectSuffix) $(IntermediateDirectory)/crypto.c$(ObjectSuffix)



Objects=$(Objects0) 

##
## Main Build Targets 
##
.PHONY: all clean PreBuild PrePreBuild PostBuild MakeIntermediateDirs
all: $(OutputFile)

$(OutputFile): $(IntermediateDirectory)/.d $(Objects) 
	@$(MakeDirCommand) $(@D)
	@echo "" > $(IntermediateDirectory)/.d
	@echo $(Objects0)  > $(ObjectsFileList)
	$(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions)

MakeIntermediateDirs:
	@test -d ./Release || $(MakeDirCommand) ./Release


$(IntermediateDirectory)/.d:
	@test -d ./Release || $(MakeDirCommand) ./Release

PreBuild:
zer0cat
() автор топика
Ответ на: комментарий от zer0cat

$(LinkerName) $(OutputSwitch)$(OutputFile) @$(ObjectsFileList) $(LibPath) $(Libs) $(LinkOptions) Тогда xaizek более, чем прав и эту опцию надо передать не во флаги компилятора, а во флаги линкера.

anonymous
()
Ответ на: комментарий от xaizek

добавлю, что не просто для LDFLAGS, а для явного ld. если в качестве линкера используеться gcc, то надо прописывать -Wl,-static

ananas ★★★★★
()
Ответ на: комментарий от zer0cat

А что там за зависимости остаются (вывод ldd)? glibc вроде нельзя было полностью статически слинковать.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

да, прогнал, причем дважды. почему-то решил, что тс-у статическая линковка только с некоторыми либами нужна, а там -Wl,-Bstatic и -Wl,-Bdynamic должны использоваться

и тс-у вопрос - а ты уверен, что у тебя в системе соответствующие lib*.a имеются?

ananas ★★★★★
()
Ответ на: комментарий от xDShot

Не стоит. Это сборку сломает. Линковать надо через драйвер компилятора, который сам подсунет стандартную библиотеку и crtbegin/crtend (main же не начало программы на самом деле).

xaizek ★★★★★
()

Оказывается, IDE добавлял еще параметр -fsanitize. Вырезал его из релиза и не надо статической линковки - все работает.

zer0cat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.