Arduino IDE 在为 Arduino UNO 编译时使用什么链接脚本?

3

1. 我想要达到的目标

我的终极目标是将Arduino项目(sketches)转换为基于makefile的自包含C/C++项目。

我已经有了一些进展(感谢@Juraj提供的有用评论)。我将所有相关的Arduino *.cpp*.h文件复制到一个文件夹中(我称之为我的“项目文件夹”),以及预处理后的sketch文件(Arduino预处理器将sketch文件转换为*.cpp文件)。

我添加了一个内部的makefile,构建非常顺利。但是,在链接的最后一步中,我仍然不知道使用了哪个linkerscript。

2. 问题解释

尽管构建 - 包括链接步骤 - 运行得很好,但我想知道正在使用哪个linkerscript。目前,avr-gcc工具链从其安装文件夹中选择一个linkerscript:

<arduino ide installation>/hardware/tools/avr/avr/lib/ldscripts

正如@Juraj在评论中所解释的那样,此工具链基于-mmcu标志进行选择。

我不希望编译器从avr-gcc工具链中选择一个固定的链接脚本。相反,我想将此链接脚本复制到我的项目文件夹中并能够对其进行调整。但是为了做到这一点- 我必须首先知道它是哪个链接脚本。我该怎么办呢?

3. 背景资料

下面您可以找到有关我的设置和系统的更多信息。

3.1.我的设置

我有一个基于ATmega328P微控制器的Arduino UNO R3。我正在使用Ubuntu 20.04.1 LTS操作系统。 我安装了Arduino IDE并从以下位置创建了一个新项目:

File > Examples > 01.Basics > Blink

我将新项目保存在 ~/Arduino/sketch_uno_blinky/sketch_uno_blinky.ino

最后,我在以下位置打勾:

File > Preferences > Show verbose output

这样我就能正确地查看编译输出。基于此,我可以追踪所有参与构建的*.cpp*.h文件。我将它们复制到一个文件夹中,以便创建一个自包含的基于makefile的项目。

3.2 链接

我这样运行链接器:

avr-gcc -Wl,-Map=output.map
        -Wl,--gc-sections
        -mmcu=atmega328p
        -DF_CPU=16000000L
        -DARDUINO=10813
        -DARDUINO_AVR_UNO
        -DARDUINO_ARCH_AVR
        -Og
        -g3
        -MMD
        -fmessage-length=0
        -ffunction-sections
        -fdata-sections
        -Wno-comment
        -Wno-unused-function
        -Werror-implicit-function-declaration
        -w
        -lm
        -flto
        -fuse-linker-plugin
        -L ../config/
        -o application.elf
        WInterrupts.o
        main.o
        hooks.o
        wiring.o
        wiring_analog.o
        wiring_digital.o
        wiring_pulse.o
        wiring_shift.o
        [...]
        sketch_uno_blinky.ino.o

这将导致生成名为 application.elf 的固件。

嗨@Juraj,非常感谢你的提示。我已经编辑了我的帖子-请查看编辑(帖子底部)。你知道答案吗? - K.Mulier
请再次阅读我的第一条评论。 - Juraj
嗨@Juraj,没错,就是-mmcu=标志。我还需要在某个地方添加specs文件吗?或者不需要吗? - K.Mulier
你必须使用avr-gcc工具链作为整体。它包含了所有需要的内容。只需使用所需的命令行选项运行链接器命令即可。 - Juraj
感谢 @Juraj ^_^ - K.Mulier
显示剩余3条评论
2个回答

1

avr-ld 的 -mcu 选项用于确定链接脚本。它从与 avr-gcc 捆绑的链接脚本中进行选择。在 Arduino 中,此文件夹与 Arduino IDE 捆绑在一起,位于硬件/工具/avr/avr/lib/ldscript 中;或者在 arduion15 文件夹中的一个 avr-gcc 版本中。

在 avr-gcc 源代码中,有一个名为 avr-mcus.def file 的文件,描述了 AVR MCUs。文件中的第二列是“architecture”,你可以在 ldscripts 中找到相应的链接脚本。例如,atmega328p 具有 ARCH_AVR5,链接脚本为 avr5.x。


1

感谢 @Juraj 的答案和所有有用的评论!

我找到了另一种查看正在使用的链接脚本的方法。只需将此标志添加到链接器调用中:-Wl,--verbose

我得到以下输出:

GNU ld (GNU Binutils) 2.26.20160125
  Supported emulations:
   avr2
   avr1
   avr25
   avr3
   avr31
   avr35
   avr4
   avr5
   avr51
   avr6
   avrxmega1
   avrxmega2
   avrxmega3
   avrxmega4
   avrxmega5
   avrxmega6
   avrxmega7
   avrtiny
opened script file /home/kristof/gnu_avr_toolchain/avr/bin/../lib/ldscripts/avr5.xn
using external linker script:
==================================================
/* Script for -n: mix text and data on same page */
/* Copyright (C) 2014-2015 Free Software Foundation, Inc.
   Copying and distribution of this script, with or without modification,
   are permitted in any medium without royalty provided the copyright
   notice and this notice are preserved.  */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:5)
__TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : 128K;
__DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : 0xffa0;
__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K;
__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K;
__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K;
__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K;
__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K;
__DATA_REGION_ORIGIN__ = DEFINED(__DATA_REGION_ORIGIN__) ? __DATA_REGION_ORIGIN__ : 0x800060;
MEMORY
{
  text   (rx)   : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__
  data   (rw!x) : ORIGIN = __DATA_REGION_ORIGIN__, LENGTH = __DATA_REGION_LENGTH__
  eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__
  fuse      (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
  lock      (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__
  signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__
  user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__
}
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  .hash          : { *(.hash) }
  .dynsym        : { *(.dynsym) }
  .dynstr        : { *(.dynstr) }
  .gnu.version   : { *(.gnu.version) }
  .gnu.version_d   : { *(.gnu.version_d) }
  .gnu.version_r   : { *(.gnu.version_r) }
  .rel.init      : { *(.rel.init) }
  .rela.init     : { *(.rela.init) }
  .rel.text      :
    {
      *(.rel.text)
      *(.rel.text.*)
      *(.rel.gnu.linkonce.t*)
    }
  .rela.text     :
    {
      *(.rela.text)
      *(.rela.text.*)
      *(.rela.gnu.linkonce.t*)
    }
  .rel.fini      : { *(.rel.fini) }
  .rela.fini     : { *(.rela.fini) }
  .rel.rodata    :
    {
      *(.rel.rodata)
      *(.rel.rodata.*)
      *(.rel.gnu.linkonce.r*)
    }
  .rela.rodata   :
    {
      *(.rela.rodata)
      *(.rela.rodata.*)
      *(.rela.gnu.linkonce.r*)
    }
  .rel.data      :
    {
      *(.rel.data)
      *(.rel.data.*)
      *(.rel.gnu.linkonce.d*)
    }
  .rela.data     :
    {
      *(.rela.data)
      *(.rela.data.*)
      *(.rela.gnu.linkonce.d*)
    }
  .rel.ctors     : { *(.rel.ctors) }
  .rela.ctors    : { *(.rela.ctors) }
  .rel.dtors     : { *(.rel.dtors) }
  .rela.dtors    : { *(.rela.dtors) }
  .rel.got       : { *(.rel.got) }
  .rela.got      : { *(.rela.got) }
  .rel.bss       : { *(.rel.bss) }
  .rela.bss      : { *(.rela.bss) }
  .rel.plt       : { *(.rel.plt) }
  .rela.plt      : { *(.rela.plt) }
  /* Internal text space or external memory.  */
  .text   :
  {
    *(.vectors)
    KEEP(*(.vectors))
    /* For data that needs to reside in the lower 64k of progmem.  */
     *(.progmem.gcc*)
    /* PR 13812: Placing the trampolines here gives a better chance
       that they will be in range of the code that uses them.  */
    . = ALIGN(2);
     __trampolines_start = . ;
    /* The jump trampolines for the 16-bit limited relocs will reside here.  */
    *(.trampolines)
     *(.trampolines*)
     __trampolines_end = . ;
    /* avr-libc expects these data to reside in lower 64K. */
     *libprintf_flt.a:*(.progmem.data)
     *libc.a:*(.progmem.data)
     *(.progmem*)
    . = ALIGN(2);
    /* For future tablejump instruction arrays for 3 byte pc devices.
       We don't relax jump/call instructions within these sections.  */
    *(.jumptables)
     *(.jumptables*)
    /* For code that needs to reside in the lower 128k progmem.  */
    *(.lowtext)
     *(.lowtext*)
     __ctors_start = . ;
     *(.ctors)
     __ctors_end = . ;
     __dtors_start = . ;
     *(.dtors)
     __dtors_end = . ;
    KEEP(SORT(*)(.ctors))
    KEEP(SORT(*)(.dtors))
    /* From this point on, we don't bother about wether the insns are
       below or above the 16 bits boundary.  */
    *(.init0)  /* Start here after reset.  */
    KEEP (*(.init0))
    *(.init1)
    KEEP (*(.init1))
    *(.init2)  /* Clear __zero_reg__, set up stack pointer.  */
    KEEP (*(.init2))
    *(.init3)
    KEEP (*(.init3))
    *(.init4)  /* Initialize data and BSS.  */
    KEEP (*(.init4))
    *(.init5)
    KEEP (*(.init5))
    *(.init6)  /* C++ constructors.  */
    KEEP (*(.init6))
    *(.init7)
    KEEP (*(.init7))
    *(.init8)
    KEEP (*(.init8))
    *(.init9)  /* Call main().  */
    KEEP (*(.init9))
    *(.text)
    . = ALIGN(2);
     *(.text.*)
    . = ALIGN(2);
    *(.fini9)  /* _exit() starts here.  */
    KEEP (*(.fini9))
    *(.fini8)
    KEEP (*(.fini8))
    *(.fini7)
    KEEP (*(.fini7))
    *(.fini6)  /* C++ destructors.  */
    KEEP (*(.fini6))
    *(.fini5)
    KEEP (*(.fini5))
    *(.fini4)
    KEEP (*(.fini4))
    *(.fini3)
    KEEP (*(.fini3))
    *(.fini2)
    KEEP (*(.fini2))
    *(.fini1)
    KEEP (*(.fini1))
    *(.fini0)  /* Infinite loop after program termination.  */
    KEEP (*(.fini0))
     _etext = . ;
  }  > text
  .data          :
  {
     PROVIDE (__data_start = .) ;
    *(.data)
     *(.data*)
    *(.gnu.linkonce.d*)
    *(.rodata)  /* We need to include .rodata here if gcc is used */
     *(.rodata*) /* with -fdata-sections.  */
    *(.gnu.linkonce.r*)
    . = ALIGN(2);
     _edata = . ;
     PROVIDE (__data_end = .) ;
  }  > data AT> text
  .bss  ADDR(.data) + SIZEOF (.data)   : AT (ADDR (.bss))
  {
     PROVIDE (__bss_start = .) ;
    *(.bss)
     *(.bss*)
    *(COMMON)
     PROVIDE (__bss_end = .) ;
  }  > data
   __data_load_start = LOADADDR(.data);
   __data_load_end = __data_load_start + SIZEOF(.data);
  /* Global data not cleared after reset.  */
  .noinit  ADDR(.bss) + SIZEOF (.bss)  :  AT (ADDR (.noinit))
  {
     PROVIDE (__noinit_start = .) ;
    *(.noinit*)
     PROVIDE (__noinit_end = .) ;
     _end = . ;
     PROVIDE (__heap_start = .) ;
  }  > data
  .eeprom  :
  {
    /* See .data above...  */
    KEEP(*(.eeprom*))
     __eeprom_end = . ;
  }  > eeprom
  .fuse  :
  {
    KEEP(*(.fuse))
    KEEP(*(.lfuse))
    KEEP(*(.hfuse))
    KEEP(*(.efuse))
  }  > fuse
  .lock  :
  {
    KEEP(*(.lock*))
  }  > lock
  .signature  :
  {
    KEEP(*(.signature*))
  }  > signature
  .user_signatures  :
  {
    KEEP(*(.user_signatures*))
  }  > user_signatures
  /* Stabs debugging sections.  */
  .stab 0 : { *(.stab) }
  .stabstr 0 : { *(.stabstr) }
  .stab.excl 0 : { *(.stab.excl) }
  .stab.exclstr 0 : { *(.stab.exclstr) }
  .stab.index 0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment 0 : { *(.comment) }
  .note.gnu.build-id : { *(.note.gnu.build-id) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug          0 : { *(.debug) }
  .line           0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo  0 : { *(.debug_srcinfo) }
  .debug_sfnames  0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
  /* DWARF 3 */
  .debug_pubtypes 0 : { *(.debug_pubtypes) }
  .debug_ranges   0 : { *(.debug_ranges) }
  /* DWARF Extension.  */
  .debug_macro    0 : { *(.debug_macro) }
}

==================================================
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/crtatmega328p.o succeeded
/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/crtatmega328p.o
attempt to open ../config//libm.so failed
attempt to open ../config//libm.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libm.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libm.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libm.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libm.a succeeded
attempt to open WInterrupts.o succeeded
WInterrupts.o
attempt to open hooks.o succeeded
hooks.o
attempt to open wiring.o succeeded
wiring.o
attempt to open wiring_analog.o succeeded
wiring_analog.o
attempt to open wiring_digital.o succeeded
wiring_digital.o
attempt to open wiring_pulse.o succeeded
wiring_pulse.o
attempt to open wiring_shift.o succeeded
wiring_shift.o
attempt to open CDC.o succeeded
CDC.o
attempt to open HardwareSerial.o succeeded
HardwareSerial.o
attempt to open HardwareSerial0.o succeeded
HardwareSerial0.o
attempt to open HardwareSerial1.o succeeded
HardwareSerial1.o
attempt to open HardwareSerial2.o succeeded
HardwareSerial2.o
attempt to open HardwareSerial3.o succeeded
HardwareSerial3.o
attempt to open IPAddress.o succeeded
IPAddress.o
attempt to open PluggableUSB.o succeeded
PluggableUSB.o
attempt to open Print.o succeeded
Print.o
attempt to open Stream.o succeeded
Stream.o
attempt to open Tone.o succeeded
Tone.o
attempt to open USBCore.o succeeded
USBCore.o
attempt to open WMath.o succeeded
WMath.o
attempt to open WString.o succeeded
WString.o
attempt to open abi.o succeeded
abi.o
attempt to open main.o succeeded
main.o
attempt to open new.o succeeded
new.o
attempt to open sketch_uno_blinky.ino.o succeeded
sketch_uno_blinky.ino.o
attempt to open ../config//libgcc.so failed
attempt to open ../config//libgcc.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a succeeded
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_exit.o
attempt to open ../config//libm.so failed
attempt to open ../config//libm.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libm.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libm.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libm.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libm.a succeeded
attempt to open ../config//libc.so failed
attempt to open ../config//libc.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libc.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libc.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a succeeded
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)dtostrf.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)random.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)atof.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)atol.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)strcpy_P.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)strlen_P.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)itoa.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)itoa_ncheck.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)ltoa.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)ltoa_ncheck.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)mulsi10.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)ultoa.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)ultoa_ncheck.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)utoa.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)utoa_ncheck.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)dtoa_prf.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)strtod.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)ftoa_engine.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)isspace.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)strncasecmp_P.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)strrev.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)cmpsf2.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)floatsisf.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_cmp.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)mulsf3.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)mulsf3x.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)errno.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)cty_isfalse.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_inf.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_nan.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_pscA.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_pscB.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_round.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_split3.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libc.a)fp_zero.o
attempt to open ../config//libatmega328p.so failed
attempt to open ../config//libatmega328p.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libatmega328p.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libatmega328p.a failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libatmega328p.so failed
attempt to open /home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/../../../../avr/lib/avr5/libatmega328p.a succeeded
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_divmodsi4.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_negsi2.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_copy_data.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_clear_bss.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_muluhisi3.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_mulshisi3.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_prologue.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_epilogue.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_udivmodsi4.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_umulhisi3.o
attempt to open /tmp/ccAFolcs.ltrans0.ltrans.o succeeded
/tmp/ccAFolcs.ltrans0.ltrans.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_ctors.o
(/home/kristof/gnu_avr_toolchain/bin/../lib/gcc/avr/7.3.0/avr5/libgcc.a)_tablejump2.o

正如您所看到的,输出提到了链接脚本的确切位置。
opened script file /home/kristof/gnu_avr_toolchain/avr/bin/../lib/ldscripts/avr5.xn

它甚至打印文件的全部内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接