CMake 和命令行之间的 avr-gcc ELF 不同

avr-gcc ELF different between CMake and command line

我在使用 CMake 项目构建带有 avr-gcc 的 ELF 可执行文件时遇到困难。我的可执行文件应该 运行 使用我和同事编写的虚拟机的自定义字节码文件,因此我希望它有几千字节大。但是,当我 运行 我的 CMake 脚本时,我得到一个 321 字节的 ELF 文件,而从终端 avr-gcc 命令我得到一个 20KB 的文件。

我做了很多搜索,似乎 CMake 确实进行了单独的编译——它构建目标文件,然后 然后 链接它们。这似乎是我问题的根源。

但是,当然,我的实际代码有点长。所以这里更 minimal, complete and verifiable example :) .

这是我要使用 avr-gcc 编译的文件。

// foo.c

#define sz 400

volatile unsigned int foo[sz] = { 0, 1, 2, 3, 4 };


int main() {
    volatile unsigned int bar = 0;
    for (volatile int i = 0; i < sz; ++i) {
        bar += foo[i];
    }
    for (volatile int i = 0; i < sz; ++i) {
        bar += foo[i];
    }
    for (volatile int i = 0; i < sz; ++i) {
        bar += foo[i];
    }
    return bar;
}

然后 运行 这个 bash 脚本:

#!/bin/bash
rm -rf build
mkdir -p build
cd build

# Single command compilation
avr-gcc ../foo.c -o foo_all_in_one.elf -std=c99 -mmcu=atmega328p -Wall -Wl,-s -Wl,--gc-sections

# Separate compilation
avr-gcc ../foo.c -c -o foo_separate.c.obj -std=c99 -mmcu=atmega328p -Wall
avr-gcc foo_separate.c.obj -o foo_separate.elf -Wall -Wl,-s -Wl,--gc-sections

ls -lh

输出:

total 12K
-rwxrwxr-x 1 anthonyd973 anthonyd973 1.7K May 26 09:35 foo_all_in_one.elf
-rw-rw-r-- 1 anthonyd973 anthonyd973 2.0K May 26 09:35 foo_separate.c.obj
-rwxrwxr-x 1 anthonyd973 anthonyd973  296 May 26 09:35 foo_separate.elf

一体编译生成1.7KB的elf文件,单独编译生成296B的文件。为什么不同?

A​​VR 的链接器必须知道您正在为哪个微控制器编程。我没有足够的技术知识来解释原因,但我想这与段放置或类似的东西有关。如果你有更好的解释,欢迎再回答这个问题,我会采纳。

无论如何,如果我在链接命令中添加 -mmcu=atmega328p,一切正常。

#!/bin/bash
rm -rf build
mkdir -p build
cd build

# Single command compilation
avr-gcc ../foo.c -o foo_all_in_one.elf -std=c99 -mmcu=atmega328p -Wall -Wl,-s -Wl,--gc-sections

# Separate compilation
avr-gcc ../foo.c -c -o foo_separate.c.obj -std=c99 -mmcu=atmega328p -Wall
avr-gcc foo_separate.c.obj -o foo_separate.elf -mmcu=atmega328p -Wall -Wl,-s -Wl,--gc-sections

ls -lh

输出:

total 12K
-rwxrwxr-x 1 anthonyd973 anthonyd973 1.7K May 26 09:41 foo_all_in_one.elf
-rw-rw-r-- 1 anthonyd973 anthonyd973 2.0K May 26 09:41 foo_separate.c.obj
-rwxrwxr-x 1 anthonyd973 anthonyd973 1.7K May 26 09:41 foo_separate.elf