简体   繁体   中英

What linkerscript does Arduino IDE use when compiling for the Arduino UNO?

1. What I'm trying to achieve

My ultimate goal is to convert Arduino projects (sketches) into makefile-based self-contained C/C++ projects.

I already made some progress (thanks @Juraj for your helpful comments). I copy all the relevant Arduino *.cpp and *.h files to a folder (which I call my "project folder") as well as the preprocessed sketch file (the Arduino preprocessor turns the sketch file into a *.cpp file).

I added an in-house makefile and the build works very well. However, in the last step - the linking - it's still a mystery to me what linkerscript is being used exactly.

2. The problem explained

Although the build - including the linking step - works very well, I'd like to know what linkerscript is being used. Right now, the avr-gcc toolchain chooses a linkerscript from its installation folder:

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

As @Juraj explains in the comments, the toolchain bases its choice on the -mmcu flag.

I don't want the compiler to choose a fixed linkerscript from the avr-gcc toolchain. Instead, I want to copy this linkerscript right into my project folder and be able to tweak it. But to do that - I must first know which linkerscript it is. How can I know?

3. Background info

Below you can find more information about my setup and system.

3.1. My setup

I've got an Arduino UNO R3 which is based on the ATmega328P microcontroller. I'm working in Ubuntu 20.04.1 LTS . I installed the Arduino IDE and created a new project from:

File > Examples > 01.Basics > Blink

I saved the new project at ~/Arduino/sketch_uno_blinky/sketch_uno_blinky.ino

Finally I ticked the checkmark at:

File > Preferences > Show verbose output

such that I can see the compilation output properly. Based on that, I could track all the *.cpp and *.h files that take part in the build. I copied them to a folder to make my own self-contained makefile-based project.

3.2 Linking

I run the linker like this:

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

which results in the application.elf firmware.

The -mcu option of avr-ld determines the linker script. It selects from linker scripts bundled with avr-gcc. With Arduino this folder is bundled with Arduino IDE in installation folder in hardware/tools/avr/avr/lib/ldscript or with one of the avr-gcc versions in arduion15 folder in packages/arduino/tools/avr-gcc.

In avr-gcc surce code there is a avr-mcus.def file which describes the AVR MCUs. The second column in the file is the 'architecture' and you can find a corresponding linker script in ldscripts. For example atmega328p has ARCH_AVR5 and the linker script is avr5.x

Thank you @Juraj for your answer and all the helpful comments!

I've found another way to see what linkerscript is being used. Just add this flag to the linker invocation: -Wl,--verbose

I get the following output:

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

As you can see, the output mentions the exact location of the linkerscript:

opened script file /home/kristof/gnu_avr_toolchain/avr/bin/../lib/ldscripts/avr5.xn

It even prints the whole content of the file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM