2012-07-01 3 views
1

하나의 주 메이크 파일에 두 개의 메이크 파일이 포함되어 있습니다. 두 번째 메이크 파일에서 다음과 같은 규칙이있다 :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] 
+0

이상합니다. 이 동작을 제공하는 최소한의 완전한 makefile을 우리에게 줄 수 있습니까? 즉, 메이크 파일을 깎아 내고,이 동작을 유지하면서 가능한 한 많은 것을 잘라 내고 남은 것을 게시 할 수 있습니까? – Beta

+0

문제를 설명하는 최소한의 메이크 파일이 아닙니다. 최소 50 %의 재료가 최소 재생산을 위해 불필요합니다. (예를 들어 종속성 처리가 최소한이 아니거나 문제가 재현되는 것이 왜 중요한지를 설명해야하며 종속성 처리 코드의 내용을 표시해야합니다.) 또한 주 메이크 파일과 하나의 포함 된 파일 두 가지 파일을 보여줍니다. 우리는 당신이하는 일을 신성하게 할 수 없습니다. –

+0

메인 메이크 - http://pastebin.com/zhyVwHJc 1 -http : //pastebin.com/BtuBTEM6 2 - http://pastebin.com/LgMwgFPn – Jah

답변

1

GNU 메이크업은 전체 Makefile을 읽고 (그리고 모두 메이크를 포함)은 평가를 시작하기 전에 메모리에 규칙. 규칙의 명령에있는 변수는 규칙을 실행할 때 확장되며 읽을 때가 아니라 확장됩니다. 다음 예를 참조하십시오 "모든"규칙이 실행될 때, $ (VAR)가 그 값을 가지고 있기 때문에

VAR = aaa 

all: 
    @echo $(VAR) 

VAR += bbb 

"확인", "AAA BBB"출력을 생성합니다.

Makefile에 다른 파일이 포함되어 있으면 모든 것이 하나의 큰 Makefile로 간주됩니다.