首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在编译Linux内核时,有哪些代码(如CC、LD和CC[M]输出)?

在编译Linux内核时,有哪些代码(如CC、LD和CC[M]输出)?
EN

Stack Overflow用户
提问于 2012-07-28 02:37:15
回答 3查看 13.6K关注 0票数 18

在从头编译Linux时,我意识到编译时会出现编译代码。

例如CC文件名、LD文件名、CCM文件名。

这些密码是什么意思?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-28 06:07:21

不同的标记指定如下:

  • CC -将C文件编译为指定的对象文件。对象文件包含该.c文件的结构汇编程序代码。因为它也可能引用超出其范围的部分。例如,在另一个.c文件中调用另一个函数。函数调用在对象文件中保持为打开状态,该对象文件稍后由链接器包含。因此
  • LD是将已编译的对象链接在一起的过程,并将编译器一直打开的函数调用连接起来。然而,许多部分作为内核的核心部分被连接在一起,而一些部分被忽略了。这样你就可以看到
  • 对于那些被编译为要在运行时加载到内核中的点的部分,CC (M)。但它们并没有在内核的整体部分连接在一起。而是可以在启动内核时插入。
票数 23
EN

Stack Overflow用户

发布于 2015-08-15 11:16:37

让我们以一个具体的例子为例,找出它在内核4.1中所做的事情,例如IHEX

查找代码做什么

只管跑:

代码语言:javascript
运行
复制
make SHELL='sh -x'

如何工作:https://stackoverflow.com/a/32010960/895245

如果我们对IHEX的输出进行grep,我们可以找到以下行:

代码语言:javascript
运行
复制
+ echo   IHEX    firmware/e100/d101s_ucode.bin
  IHEX    firmware/e100/d101s_ucode.bin
+ objcopy -Iihex -Obinary /home/ciro/git/kernel/src/firmware/e100/d101s_ucode.bin.ihex firmware/e100/d101s_ucode.bin

因此,我们得出结论,IHEXobjcopy -Iihex

查找代码定义的位置,

每个内核命令都必须定义如下所示:

代码语言:javascript
运行
复制
quiet_cmd_ihex  = IHEX    $@
      cmd_ihex  = $(OBJCOPY) -Iihex -Obinary $< $@

$(obj)/%: $(obj)/%.ihex
        $(call cmd,ihex)

详细设置(例如V=1make -s)才能工作。

所以总的来说,你只需要

代码语言:javascript
运行
复制
git grep 'cmd.* = CODE'

去找CODE

我已经详细解释了这个系统是如何工作的:https://stackoverflow.com/a/32023861/895245

获得所有代码的列表

代码语言:javascript
运行
复制
make | grep -E '^  ' | sort -uk1,1

CC和CC M

scripts/Makefile.build中定义

代码语言:javascript
运行
复制
quiet_cmd_cc_o_c = CC $(quiet_modtag)  $@
      cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<

[M]来自target specific variables

代码语言:javascript
运行
复制
$(real-objs-m)        : quiet_modtag := [M]
$(real-objs-m:.o=.i)  : quiet_modtag := [M]
$(real-objs-m:.o=.s)  : quiet_modtag := [M]
$(real-objs-m:.o=.lst): quiet_modtag := [M]
$(obj-m)              : quiet_modtag := [M]

然后通过以下方式调用:

代码语言:javascript
运行
复制
$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
    [...]
    $(call if_changed_rule,cc_o_c)

define rule_cc_o_c
    [...]
    $(call echo-cmd,cc_o_c) $(cmd_cc_o_c);                \

其中if_changed_rulescripts/Kbuild.include中定义为:

代码语言:javascript
运行
复制
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ),                 \
    @set -e;                                                             \
    $(rule_$(1)))

Kbuild.include包含在顶层Makefile中。

LD

有几个版本,但最简单的似乎是:

代码语言:javascript
运行
复制
quiet_cmd_link_o_target = LD      $@
cmd_link_o_target = $(if $(strip $(obj-y)),\
              $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
              $(cmd_secanalysis),\
              rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)

$(builtin-target): $(obj-y) FORCE
    $(call if_changed,link_o_target)

scripts/Kbuild.include

代码语言:javascript
运行
复制
# Execute command if command has changed or prerequisite(s) are updated.
#
if_changed = $(if $(strip $(any-prereq) $(arg-check)),                       \
    @set -e;                                                             \
    $(echo-cmd) $(cmd_$(1));                                             \
    printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
票数 10
EN

Stack Overflow用户

发布于 2012-07-28 05:14:31

它应表明:

  • 编译内核核心部分时的CC
  • 编译模块时的CC [M]
  • 链接时的LD
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11697800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档