【问题标题】:Understanding code block from XV6 makefile从 XV6 makefile 中理解代码块
【发布时间】:2015-04-04 16:47:57
【问题描述】:

我正在尝试从 XV6 makefile 中理解以下代码块:

ULIB = ulib.o usys.o printf.o umalloc.o

_%: %.o $(ULIB)
    $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^
    $(OBJDUMP) -S $@ > $*.asm
    $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $*.sym

我在哪里可以找到解释上述所有选项的参考资料?例如,我试图在 GNU 网站上查找选项“-N”,但没有找到。

提前致谢

【问题讨论】:

    标签: c linux makefile gnu xv6


    【解决方案1】:

    我不是 Makefile 方面的专家,但您可能正在寻找几个 GNU 程序的 man 页面。
    这一行,例如:

    $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^
    

    如果我理解正确的话,是bashmake 语法的混合体:

    • $(LD)make 变量LD 替换,它很可能包含链接器可执行文件的名称(通常为ld)。
    • $(LDFLAGS) 与上面类似,不同之处在于它持有 flags 以传递给以LD 命名的可执行文件。
    • -N -e main -Ttext 0 -o 只是 LD 的参数
    • $@ 被目标替换
    • $^ 被替换为所有依赖项的空格分隔列表

    因此,如果您想了解-N 选项,最好的选择是GNU ld man page

    -N
    --魔幻
    将文本和数据部分设置为可读可写。此外,不要对数据段进行页面对齐,并禁用对共享库的链接。如果输出格式支持 Unix 风格的幻数,则将输出标记为“OMAGIC”。注意:虽然 PE-COFF 目标允许可写文本部分,但它不符合 Microsoft 发布的格式规范。

    【讨论】:

    • 有没有什么办法可以调试这种和平的代码来准确理解它的作用?
    • 有什么要调试的?只需阅读不同命令的man 页面或用谷歌搜索它们。但是第一个命令链接目标,第二个反汇编它,第三个转储它的符号表。
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多