gpt4 book ai didi

makefile - 使用 make,如何在程序集项目中使用 .c 文件防止这种行为?

转载 作者:行者123 更新时间:2023-12-02 08:04:59 24 4
gpt4 key购买 nike

我正在制作一个 super 简单的 NASM x86_64 汇编程序 mytest.asm

BITS 64
GLOBAL _start

SECTION .text
_start:
mov rax, 60 ; 'exit' system call
mov rdi, 42 ; exit with error code 42
syscall

这个程序所做的就是以状态 42 退出。我为它制作了一个非常简单的 Makefile,

AS=nasm
ASFLAGS=-f elf64

.PHONY: all

all: mytest

%.o : %.asm
$(AS) $(ASFLAGS) -o "$@" "$<"

% : %.o
$(LD) $(LDFLAGS) -o "$@" "$<"

当执行时,这工作正常,

nasm -f elf64 -o "mytest.o" "mytest.asm"
ld -m elf_x86_64 -o "mytest" "mytest.o"
rm mytest.o

除非有与.c同名的文件,例如这里的mytest.c

// exits with status 66
int main () {
__asm__ (
"mov $60, %%rax\n\t"
"mov $66, %%rdi\n\t"
"syscall\n\t"
::: "%rax", "%rdi"
);
}

如果我使用以下文件运行 make,C 代码实际上会编译为 mytest

尴尬的是,$(LDARGS) 被发送到 $(CC) 而不是 $(LD)。这对我来说似乎不安全,任何拥有这种非常典型的 Makefile 的人都可以通过插入具有相同名称的 .c 文件从代码名称生成可执行文件吗?

GNU Make 是否记录了此行为?

GNU Make 4.1
Built for x86_64-pc-linux-gnu

理想情况下,.c 文件的存在不会影响程序集构建流。

最佳答案

这来自Make’s built-in rules . Make 知道如何从 C 文件构建可执行文件,因此当您要求它构建 mytest(这是 make 所做的,因为您有一个 all目标需要 mytest),它构建了它的依赖树并指出:

  • 它可以根据其内置规则从mytest.c 构建mytest
  • 它可以根据您指定的规则从 mytest.o 构建 mytest
  • 它可以根据其内置规则从mytest.c构建mytest.o
  • 它可以根据您指定的规则从 mytest.asm 构建 mytest.o

第一个规则获胜(我不确定优先级是什么),这就是它的作用。

您可以使用 -r 选项禁用它:

make -r mytest

将始终使用您的规则来构建程序。

您也可以cancel built-in rules要么

  • 分别通过重新定义它们:

    % : %.c

    Makefile 的末尾将禁用该内置规则并导致您所追求的行为;

  • 通过在您的 Makefile 中指定 MAKEFLAGS += -r 进行全局操作。

关于makefile - 使用 make,如何在程序集项目中使用 .c 文件防止这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52577470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com