Arduino IDE 在为 Arduino UNO 编译时使用什么链接描述文件?
What linkerscript does Arduino IDE use when compiling for the Arduino UNO?
1。我想要达到的目标
我的最终目标是将 Arduino 项目(草图)转换为基于 makefile 的独立 C/C++ 项目。
我已经取得了一些进展(感谢@Juraj 的有益评论)。我将所有相关的 Arduino *.cpp
和 *.h
文件复制到一个文件夹(我称之为“项目文件夹”)以及预处理的草图文件(Arduino 预处理器将草图文件转换为 *.cpp
文件).
我添加了一个内部生成文件,并且构建工作得很好。然而,在最后一步——链接——我仍然不知道到底使用了什么链接描述文件。
2。问题解释
尽管构建(包括链接步骤)运行良好,但我想知道正在使用什么链接描述文件。现在,avr-gcc
工具链从其安装文件夹中选择一个链接描述文件:
<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
固件。
avr-ld 的 -mcu 选项决定链接描述文件。它从与 avr-gcc 捆绑在一起的链接器脚本中进行选择。对于 Arduino,此文件夹与 hardware/tools/avr/avr/lib/ldscript 中安装文件夹中的 Arduino IDE 或 packages/arduino/tools/avr-gcc 中 arduion15 文件夹中的 avr-gcc 版本之一捆绑在一起。
在 avr-gcc 源代码中有一个 avr-mcus.def file 描述了 AVR MCU。文件中的第二列是 'architecture',您可以在 ldscripts 中找到相应的链接描述文件。例如 atmega328p 有 ARCH_AVR5 并且链接描述文件是 avr5.x
感谢@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
它甚至打印文件的全部内容。
1。我想要达到的目标
我的最终目标是将 Arduino 项目(草图)转换为基于 makefile 的独立 C/C++ 项目。
我已经取得了一些进展(感谢@Juraj 的有益评论)。我将所有相关的 Arduino *.cpp
和 *.h
文件复制到一个文件夹(我称之为“项目文件夹”)以及预处理的草图文件(Arduino 预处理器将草图文件转换为 *.cpp
文件).
我添加了一个内部生成文件,并且构建工作得很好。然而,在最后一步——链接——我仍然不知道到底使用了什么链接描述文件。
2。问题解释
尽管构建(包括链接步骤)运行良好,但我想知道正在使用什么链接描述文件。现在,avr-gcc
工具链从其安装文件夹中选择一个链接描述文件:
<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
固件。
avr-ld 的 -mcu 选项决定链接描述文件。它从与 avr-gcc 捆绑在一起的链接器脚本中进行选择。对于 Arduino,此文件夹与 hardware/tools/avr/avr/lib/ldscript 中安装文件夹中的 Arduino IDE 或 packages/arduino/tools/avr-gcc 中 arduion15 文件夹中的 avr-gcc 版本之一捆绑在一起。
在 avr-gcc 源代码中有一个 avr-mcus.def file 描述了 AVR MCU。文件中的第二列是 'architecture',您可以在 ldscripts 中找到相应的链接描述文件。例如 atmega328p 有 ARCH_AVR5 并且链接描述文件是 avr5.x
感谢@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
它甚至打印文件的全部内容。