gcc / make - 如何定义依赖关系来生成和编译程序集(.s)文件?

时间:2017-01-15 14:05:41

标签: gcc makefile compilation

我正在尝试编写一个生成汇编文件的makefile (通过使用-S标志调用gcc),然后修改生成的s.-files 然后编译它。为了找到一种方法,我做了一个简短的样本 当我精确列出.s-sourcefiles的名称(main.s,mod1.s等)时,makefile工作正常。

"Hello! Are you tired? No, not at all!"

这是按预期工作的。 但是当我定义依赖性的时候 更通用(“%。o:%。s”) 不再生成程序集(.s)文件:

from socket import *

BUF_LEN = 8192 * 100000

info = getaddrinfo('google.com', 80, AF_INET)
addr = info[-1][-1]
print(addr)

client = socket(AF_INET, SOCK_STREAM)

client.connect(addr)

client.send(b"GET /index.html HTTP1.1\r\nHost: www.google.com\r\n")
print(client.recv(BUF_LEN).decode("utf-8")) # print nothing

任何解释,即想法如何实施这些步骤?

2 个答案:

答案 0 :(得分:2)

您需要将汇编程序文件标记为珍贵:

.PRECIOUS: %.s

或只是标记添加以下内容以强制保留所有中间输出:

.SECONDARY:

另见this question

答案 1 :(得分:0)

非常感谢yugr,-r标志是相关提示! 对于任何扼杀相同行为的人: 以下makefile(与上面相比,.PRECIOUS:已添加%.s)生成所需的输出(.s和.o文件):

    objects = main.o mod1.o
    assembly = main.s mod1.s

    .PRECIOUS: %.s
    app : $(objects)
        gcc -o app $(objects)
        chmod +x app
    %.s : %.c
        gcc -S $<
    #   here some code will be called to modify 
    #   the .s file for some experimental purpose ..
    %.o : %.s
        gcc -c $<
    cleanobj :
        rm app $(objects)
    cleanass :
        rm $(assembly)
    cleanall : cleanobj cleanass

生成,用

调用
    make
    cc    -c -o main.o main.c
    cc    -c -o mod1.o mod1.c
    gcc -o app main.o mod1.o
    chmod +x app

但是在用

调用时
    make -r
    gcc -S main.c
    gcc -c main.s
    gcc -S mod1.c
    gcc -c mod1.s
    gcc -o app main.o mod1.o
    chmod +x app

即。创建了所需的.s文件,这也导致了一个可执行的应用程序。

请注意目标文件夹中不存在.o或.s文件。