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的文件。为什么不同?
AVR 的链接器必须知道您正在为哪个微控制器编程。我没有足够的技术知识来解释原因,但我想这与段放置或类似的东西有关。如果你有更好的解释,欢迎再回答这个问题,我会采纳。
无论如何,如果我在链接命令中添加 -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
我在使用 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的文件。为什么不同?
AVR 的链接器必须知道您正在为哪个微控制器编程。我没有足够的技术知识来解释原因,但我想这与段放置或类似的东西有关。如果你有更好的解释,欢迎再回答这个问题,我会采纳。
无论如何,如果我在链接命令中添加 -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