하나의 주 메이크 파일에 두 개의 메이크 파일이 포함되어 있습니다. 두 번째 메이크 파일에서 다음과 같은 규칙이있다 :Makefile의 변수 누수
내가 이해했듯이$(MAKEFILE2_OBJS): CFLAGS += -fPIC
, 내가 MAKEFILE2_OBJS에 대한 CFLAGS 만 에 추가됩니다 -fPIC 이와 같은 규칙을 작성합니다. 그러나 암시 적 규칙을 사용하여 MAKEFILE1_OBJS를 컴파일하면 CFLAGS에 두 번째 메이크 파일의 -fPIC 플래그가 있습니다.
왜 그런가?
홈페이지 메이크 :
CC := gcc
LD := gcc
AS := nasm
DEPEND := ./depend.sh
CFLAGS += -Wall -Werror -I. -g -DNDEBUG -masm=intel
ASFLAGS += -f elf64
LDFLAGS +=
TARGET := arora
MODULES := utils stage1 stage2
all: $(TARGET)
$(TARGET): stage1/arora-stage1 stage2/arora-stage2
SRCS :=
ERROR_FILES :=
OBJS :=
DEPS :=
OUTPUTS :=
include $(wildcard $(patsubst %,%/*.mk,$(MODULES)))
OBJS += $(SRCS:.c=.o)
DEPS += $(SRCS:.c=.d)
OUTPUTS += $(OBJS) $(DEPS) $(TARGET)
include $(DEPS)
%.d: %.c
$(DEPEND) `dirname $*` $(CFLAGS) $*.c > [email protected]
.PHONY: clean
clean:
rm -f $(OUTPUTS)
Makefile1 :
STAGE1_ASM_SRCS := $(wildcard $(DIR)/*/*.s)
STAGE1_ASM_OBJS := $(STAGE1_ASM_SRCS:.s=.o)
STAGE1_C_SRCS := $(wildcard $(DIR)/*/*.c)
STAGE1_C_OBJS := $(STAGE1_C_SRCS:.c=.o)
STAGE1_C_DEPS := $(STAGE1_C_OBJS:.o=.d)
STAGE1_SRCS := $(STAGE1_ASM_SRCS) $(STAGE1_C_SRCS)
STAGE1_OBJS := $(STAGE1_ASM_OBJS) $(STAGE1_C_OBJS)
SRCS += $(STAGE1_C_SRCS)
ERROR_FILES += $(wildcard $(DIR)/*/*_errors.hx)
OUTPUTS += $(patsubst %,$(DIR)/%, linker_script.lds stage1.elf stage1_exec.bin stage1_data.bin stage1_main.bin arora-main-overwritten arora-exec-free-space-overwritten arora-stage1 original-definitions original-definitions.h) $(STAGE1_ASM_OBJS)
STAGE1_INCLUDE_PATH := $(DIR)
$(STAGE1_C_OBJS) $(STAGE1_C_DEPS): CFLAGS += -fno-stack-protector -nostdlib -I$(STAGE1_INCLUDE_PATH)
# hack
include $(DIR)/original-definitions
.PHONY: $(DIR)/stage1
$(DIR)/stage1: $(DIR)/arora-stage1 $(DIR)/arora-main-overwritten $(DIR)/arora-exec-free-space-overwritten $(DIR)/original-definitions $(DIR)/original-definitions.h
$(DIR)/original-definitions.h: $(DIR)/original-definitions $(DIR)/create_original_definitions_header.sh
$(lastword $^) $< > [email protected]
$(DIR)/original-definitions: $(DIR)/arora-original $(DIR)/extract-definitions.sh
$(lastword $^) $< > [email protected]
$(DIR)/arora-stage1: $(DIR)/stage1_main.bin $(DIR)/stage1_exec.bin $(DIR)/stage1_data.bin $(DIR)/arora-original
cat $(lastword $^) > [email protected] && dd if=$< [email protected] bs=c seek=$(ARORA_MAIN_FILE_OFFSET) conv=notrunc && dd if=$(word 2, $^) [email protected] bs=c seek=$(ARORA_EXEC_FREE_SPACE_FILE_OFFSET) conv=notrunc && dd if=$(word 3, $^) [email protected] bs=c seek=$$(($(ARORA_EXEC_FREE_SPACE_FILE_OFFSET) + $$(wc -c $(word 2, $^) | awk '{print $$1}'))) conv=notrunc && chmod +x [email protected]
$(DIR)/arora-main-overwritten: $(DIR)/arora-original $(DIR)/stage1_main.bin
dd if=$< [email protected] bs=c skip=$(ARORA_MAIN_FILE_OFFSET) count=$$(wc -c $(lastword $^) | awk '{print $$1}')
$(DIR)/arora-exec-free-space-overwritten: $(DIR)/arora-original $(DIR)/stage1_exec.bin
dd if=$< [email protected] bs=c skip=$(ARORA_EXEC_FREE_SPACE_FILE_OFFSET) count=$$(wc -c $(lastword $^) | awk '{print $$1}')
$(DIR)/arora-data-free-space-overwritten: $(DIR)/arora-original $(DIR)/stage1_exec.bin $(DIR)/stage1_data.bin
dd if=$< [email protected] bs=c skip=$$(($(ARORA_EXEC_FREE_SPACE_FILE_OFFSET) + $$(wc -c $(word 2, $^) | awk '{print $$1}'))) count=$$(wc -c $(lastword $^) | awk '{print $$1}')
$(DIR)/stage1_main.bin: $(DIR)/stage1.elf
objcopy -j .arora_main -O binary $^ [email protected]
$(DIR)/stage1_exec.bin: $(DIR)/stage1.elf
objcopy -j .arora_exec_free_space -O binary $^ [email protected]
$(DIR)/stage1_data.bin: $(DIR)/stage1.elf
objcopy -j .arora_data_free_space -O binary $^ [email protected]
$(DIR)/stage1.elf: $(STAGE1_OBJS) utils/libpluginutils.a $(DIR)/linker_script.lds
$(LD) $(STAGE1_OBJS) utils/libpluginutils.a -o [email protected] $(LDFLAGS) -ldl -nostdlib -T $(lastword $^)
$(DIR)/linker_script.lds: $(DIR)/linker_script.lds.template
echo stage1_main will be at $(ARORA_MAIN_ADDRESS), the exec will be at $(ARORA_EXEC_FREE_SPACE_ADDRESS), the data will be after the exec. && sed s/ARORA_MAIN_ADDRESS/$(ARORA_MAIN_ADDRESS)/ $^ | sed s/ARORA_EXEC_FREE_SPACE_ADDRESS/$(ARORA_EXEC_FREE_SPACE_ADDRESS)/ | sed s/ARORA_DATA_LOADING_FREE_SPACE_ADDRESS/$(ARORA_DATA_LOADING_FREE_SPACE_ADDRESS)/ > [email protected]
Makefile2는 :
DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST))))
STAGE2_SRCS := $(wildcard $(DIR)/*/*.c)
STAGE2_OBJS := $(STAGE2_SRCS:.c=.o) $(DIR)/overwritten/main-overwritten.o $(DIR)/overwritten/exec-free-space-overwritten.o $(patsubst %.s, %.o, $(wildcard $(DIR)/*/*.s))
STAGE2_DEPS := $(STAGE2_OBJS:.o=.d)
SRCS += $(STAGE2_SRCS)
ERROR_FILES += $(DIR)/stage2_errors.hx
OBJS += $(DIR)/overwritten/main-overwritten.o $(DIR)/overwritten/exec-free-space-overwritten.o
OUTPUTS += $(DIR)/stage2.so $(DIR)/overwritten/exec-free-space-overwritten.h $(DIR)/overwritten/main-overwritten.h $(DIR)/arora-stage2
.PHONY: $(DIR)/stage2
$(DIR)/stage2: $(DIR)/arora-stage2
$(DIR)/arora-stage2: stage1/arora-stage1 $(DIR)/stage2.so
cat $^ > [email protected] && chmod +x [email protected]
$(DIR)/stage2.so: LDFLAGS += -shared
$(DIR)/stage2.so: $(STAGE2_OBJS) utils/libpluginutils.a
$(LD) $(LDFLAGS) $^ -o [email protected]
$(STAGE2_OBJS): CFLAGS += -fPIC
$(DIR)/overwritten/main-overwritten.o: stage1/arora-main-overwritten
objcopy -F elf64-x86-64 -B i386 -I binary $^ [email protected]
$(DIR)/overwritten/exec-free-space-overwritten.o: stage1/arora-exec-free-space-overwritten
objcopy -F elf64-x86-64 -B i386 -I binary $^ [email protected]
$(DIR)/overwritten/data-free-space-overwritten.o: stage1/arora-data-free-space-overwritten
objcopy -F elf64-x86-64 -B i386 -I binary $^ [email protected]
$(DIR)/overwritten/main-overwritten.h: $(DIR)/overwritten/main-overwritten.o $(DIR)/create_objcopy_header.sh
$(lastword $^) $< > [email protected]
$(DIR)/overwritten/exec-free-space-overwritten.h: $(DIR)/overwritten/exec-free-space-overwritten.o $(DIR)/create_objcopy_header.sh
$(lastword $^) $< > [email protected]
$(DIR)/overwritten/data-free-space-overwritten.h: $(DIR)/overwritten/data-free-space-overwritten.o $(DIR)/create_objcopy_header.sh
$(lastword $^) $< > [email protected]
이상합니다. 이 동작을 제공하는 최소한의 완전한 makefile을 우리에게 줄 수 있습니까? 즉, 메이크 파일을 깎아 내고,이 동작을 유지하면서 가능한 한 많은 것을 잘라 내고 남은 것을 게시 할 수 있습니까? – Beta
문제를 설명하는 최소한의 메이크 파일이 아닙니다. 최소 50 %의 재료가 최소 재생산을 위해 불필요합니다. (예를 들어 종속성 처리가 최소한이 아니거나 문제가 재현되는 것이 왜 중요한지를 설명해야하며 종속성 처리 코드의 내용을 표시해야합니다.) 또한 주 메이크 파일과 하나의 포함 된 파일 두 가지 파일을 보여줍니다. 우리는 당신이하는 일을 신성하게 할 수 없습니다. –
메인 메이크 - http://pastebin.com/zhyVwHJc 1 -http : //pastebin.com/BtuBTEM6 2 - http://pastebin.com/LgMwgFPn – Jah