ARM的GCC正在链接额外的数据

ARM的GCC正在链接额外的数据,gcc,linker,arm,newlib,Gcc,Linker,Arm,Newlib,我目前正在尝试将一些代码上传到LPC810上,这是一个Cortex-M0+微控制器。我有一个简单的程序,我正在尝试使用,它只是闪烁的LED上下 typedef unsigned int volatile * vp; int main() { *(vp) 0x4000C1C0 = 0xFFFFFFBFUL; *(vp) 0xA0002000 |= 1 << 2; for(;;) { *(vp) 0xA0002300 |= 1 <<

我目前正在尝试将一些代码上传到LPC810上,这是一个Cortex-M0+微控制器。我有一个简单的程序,我正在尝试使用,它只是闪烁的LED上下

typedef unsigned int volatile * vp;

int main()
{
    *(vp) 0x4000C1C0 = 0xFFFFFFBFUL;
    *(vp) 0xA0002000 |= 1 << 2;
    for(;;) {
        *(vp) 0xA0002300 |= 1 << 2;
        volatile long wait = 240000;
        while (wait > 0) --wait;
    }
    return 0;
}
我正在用这个生成一个扩展名为十六进制的二进制文件,很抱歉有任何混淆


有没有关于如何解决这个问题的想法?谢谢你的帮助

> P>优化空间的二进制文件,使用-OS,NO-O3,带符号的-S,并去掉链接中的STDC++库(STD= C++ 14),甚至不是C++程序!p> 我建议使用链接器选项链接
--gc部分
。这应该去掉所有未使用的图书馆资料

因此,将
-Wl,--gc节添加到LDFLAGS中

不过,我很确定编译器的输出并没有您想象的那么大。我假设您的二进制文件包含很多零。实际上,我假设您的有效负载少于265字节,其余为零。 这是因为您的输出链接到的地址不是零。使用
arm none eabi-e hello.ELF检查ELF文件。(您的申请代码在
部分.text
中)


要解决这个问题,我非常确定您必须了解链接器脚本是如何工作的。请检查手册“GNU链接器”以了解这一点。

您需要标准库吗?您可以使用
-nostlib
进行编译。您还可以使用
-s
去除符号。这也可能有帮助:.@John
-s
标志似乎对大小没有任何影响。我不需要标准库,但是
-nostlib
标志也会删除链接器脚本和我确实需要的其他启动代码。除此之外,这个标志是我需要的,但我还没有找到解决这个问题的方法。不过,谢谢你的回复!在
-nostlib
之后,您可以添加
-lgcc
,它应该为main设置,但不包括退出处理程序等。您可以生成一个映射文件
-Map=project.Map
,并查看链接的内容(以及原因)。实际上,如果您正在执行此操作,那么您不应该使用
main()
,而应该使用
\u start:
并清除.bss,然后设置堆栈。可能您需要一个自定义链接器文件。当使用非预期的浮点/div等时,您将知道它们。我制作了ARM Linux用户空间代码@artlessnoise,我过去也尝试过,但链接器总是让我有点不知所措。但是,也许是时候让我再试一次了。我还尝试了这些标志,并将
main
重命名为
\u start
,但仍然使用C,链接器可能找不到它。当我启动代码时,什么都没有发生,所以它可能不在内存中的正确位置。我会给一个自定义链接脚本和启动文件的镜头再次虽然,谢谢。这是返回。它有一个tar文件,它的源代码正是我所说的init.c;可能还有其他的例子。。。他的闪烁代码大约是512字节。我试过
-Os
,它删除了几个字节,但没有更多(这与过去的经验一致)。我仍然保留了大约75 K,<代码> -S < /C>根本没有影响,C++标志没有激活,因为我的文件是“代码>主目录。C <代码>,不是<代码> Me.CPP < /代码>,抱歉没有指定。相反,
-std=c11
处于活动状态。幸运的是,我能够使用自定义链接器脚本启动并运行它,但如果问题再次出现,我将在将来尝试使用该标志。虽然我忽略了细节,但我的编程工具(lpc21isp)抱怨没有扇区可供编程,所以我认为它实际上很大。据我所知,是newlib,我的libc导致了膨胀。
PROGRAM=hello
ARCH=arm-none-eabi

CC=$(ARCH)-gcc
CXX=$(ARCH)-g++
OBJCOPY=$(ARCH)-objcopy
OBJDUMP=$(ARCH)-objdump
NM=$(ARCH)-nm
SIZE=$(ARCH)-size

FLAGS=-pedantic-errors -Wall -Wextra -Werror -Wfatal-errors -O3 \
    -fdiagnostics-color -mcpu=cortex-m0plus -mthumb
CFLAGS=-std=c11 $(FLAGS)
CXXFLAGS=-std=c++14 $(FLAGS)
LDFLAGS=

OBJECTS=./obj/main.o

all: ./$(PROGRAM).hex

run: ./$(PROGRAM).hex
    sudo lpc21isp -wipe -verify -bin ./$(PROGRAM).hex /dev/ttyUSB0 115200 12000
    make clean

./$(PROGRAM).hex: ./$(PROGRAM).elf
    $(OBJCOPY) ./$(PROGRAM).elf -O binary ./$(PROGRAM).hex
    $(OBJDUMP) -D $< > $(PROGRAM).disasm
    $(NM) -n $(PROGRAM).elf > $(PROGRAM).sym
    $(SIZE) $(PROGRAM).elf

./$(PROGRAM).elf: $(OBJECTS)
    $(CC) $(FLAGS) $(LDFLAGS) $^ -o $@

./obj/%.o: ./src/%.s
    $(CC) $(FLAGS) -c $^ -o $@

./obj/%.o: ./src/%.c
    $(CC) $(CFLAGS) -c $^ -o $@

./obj/%.o: ./src/%.cpp
    $(CXX) $(CXXFLAGS) -c $^ -o $@

clean:
    rm $(OBJECTS) ./$(PROGRAM)*