+ Xtensa: generate all helper files to fpc can successfully compile a single program

git-svn-id: trunk@44461 -
This commit is contained in:
florian 2020-03-31 19:33:10 +00:00
parent aa391dadbf
commit aab0884182

View File

@ -74,7 +74,15 @@ const
begin
with Info do
begin
ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES';
if target_info.system=system_xtensa_freertos then
ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES '+
'-u call_user_start_cpu0 -u ld_include_panic_highint_hdl -u esp_app_desc -u vfs_include_syscalls_impl -u pthread_include_pthread_impl -u pthread_include_pthread_cond_impl -u pthread_include_pthread_local_storage_impl -u newlib_include_locks_impl -u newlib_include_heap_impl -u newlib_include_syscalls_impl -u newlib_include_pthread_impl -u app_main -u uxTopUsedPriority '+
'-L $IDF_PATH/components/esp_rom/esp32/ld -T esp32.rom.newlib-funcs-time.ld '+
'-T esp32.rom.ld -T esp32.rom.libgcc.ld -T esp32.rom.newlib-data.ld -T esp32.rom.syscalls.ld -T esp32.rom.newlib-funcs.ld '+
'-L . -T esp32_out.ld -T esp32.project.ld '+
'-L $IDF_PATH/components/esp32/ld -T esp32.peripherals.ld'
else
ExeCmd[1]:='ld -g '+platform_select+' $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE -T $RES';
end;
end;
@ -158,60 +166,44 @@ begin
end;
{ Write staticlibraries }
if not StaticLibFiles.Empty then
begin
{ vlink doesn't need, and doesn't support GROUP }
if (cs_link_on_target in current_settings.globalswitches) then
begin
if not(StaticLibFiles.Empty) then
begin
LinkRes.Add(')');
LinkRes.Add('GROUP(');
end;
while not StaticLibFiles.Empty do
begin
S:=StaticLibFiles.GetFirst;
LinkRes.AddFileName((maybequoted(s)));
end;
end;
while not StaticLibFiles.Empty do
begin
S:=StaticLibFiles.GetFirst;
LinkRes.AddFileName((maybequoted(s)));
end;
end;
if (cs_link_on_target in current_settings.globalswitches) then
begin
LinkRes.Add(')');
LinkRes.Add(')');
{ Write sharedlibraries like -l<lib>, also add the needed dynamic linker
here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
linklibc:=false;
while not SharedLibFiles.Empty do
begin
S:=SharedLibFiles.GetFirst;
if s<>'c' then
begin
i:=Pos(target_info.sharedlibext,S);
if i>0 then
Delete(S,i,255);
LinkRes.Add('-l'+s);
end
else
begin
LinkRes.Add('-l'+s);
linklibc:=true;
end;
end;
{ be sure that libc&libgcc is the last lib }
if linklibc then
begin
LinkRes.Add('-lc');
LinkRes.Add('-lgcc');
end;
end
else
begin
while not SharedLibFiles.Empty do
begin
S:=SharedLibFiles.GetFirst;
LinkRes.Add('lib'+s+target_info.staticlibext);
end;
LinkRes.Add(')');
end;
{ Write sharedlibraries like -l<lib>, also add the needed dynamic linker
here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
linklibc:=false;
while not SharedLibFiles.Empty do
begin
S:=SharedLibFiles.GetFirst;
if s<>'c' then
begin
i:=Pos(target_info.sharedlibext,S);
if i>0 then
Delete(S,i,255);
LinkRes.Add('-l'+s);
end
else
begin
LinkRes.Add('-l'+s);
linklibc:=true;
end;
end;
{ be sure that libc&libgcc is the last lib }
if linklibc then
begin
LinkRes.Add('-lc');
LinkRes.Add('-lgcc');
end;
{ objects which must be at the end }
if linklibc then
@ -1354,205 +1346,12 @@ begin
{$ifdef XTENSA}
with linkres do
begin
Add('/* Script for -z combreloc: combine and sort reloc sections */');
Add('/* Copyright (C) 2014-2018 Free Software Foundation, Inc.');
Add(' Copying and distribution of this script, with or without modification,');
Add(' are permitted in any medium without royalty provided the copyright');
Add(' notice and this notice are preserved. */');
Add('ENTRY(_start)');
Add('SEARCH_DIR("=/builds/idf/crosstool-NG/builds/xtensa-esp32-elf/xtensa-esp32-elf/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");');
Add('SECTIONS');
Add('{');
Add(' /* Read-only sections, merged into text segment: */');
Add(' PROVIDE (__executable_start = 0x400000); . = 0x400000 + SIZEOF_HEADERS;');
Add(' .interp : { *(.interp) }');
Add(' .note.gnu.build-id : { *(.note.gnu.build-id) }');
Add(' .hash : { *(.hash) }');
Add(' .gnu.hash : { *(.gnu.hash) }');
Add(' .dynsym : { *(.dynsym) }');
Add(' .dynstr : { *(.dynstr) }');
Add(' .gnu.version : { *(.gnu.version) }');
Add(' .gnu.version_d : { *(.gnu.version_d) }');
Add(' .gnu.version_r : { *(.gnu.version_r) }');
Add(' .rela.dyn :');
Add(' {');
Add(' *(.rela.init)');
Add(' *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)');
Add(' *(.rela.fini)');
Add(' *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)');
Add(' *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)');
Add(' *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)');
Add(' *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)');
Add(' *(.rela.ctors)');
Add(' *(.rela.dtors)');
Add(' *(.rela.got)');
Add(' *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)');
Add(' }');
Add(' .rela.plt : { *(.rela.plt) }');
Add(' /* .plt* sections are embedded in .text */');
Add(' .text :');
Add(' .data :');
Add(' {');
Add(' *(.got.plt* .plt*)');
Add(' KEEP (*(.init.literal))');
Add(' KEEP (*(SORT_NONE(.init)))');
Add(' *(.literal .text .stub .literal.* .text.* .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)');
Add(' /* .gnu.warning sections are handled specially by elf32.em. */');
Add(' *(.gnu.warning)');
Add(' KEEP (*(.fini.literal))');
Add(' KEEP (*(SORT_NONE(.fini)))');
Add(' } =0');
Add(' PROVIDE (__etext = .);');
Add(' PROVIDE (_etext = .);');
Add(' PROVIDE (etext = .);');
Add(' .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }');
Add(' .rodata1 : { *(.rodata1) }');
Add(' .got.loc : { *(.got.loc) }');
Add(' .xt_except_table : ONLY_IF_RO { KEEP (*(.xt_except_table .xt_except_table.* .gnu.linkonce.e.*)) }');
Add(' .eh_frame_hdr : { *(.eh_frame_hdr) }');
Add(' .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) }');
Add(' .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }');
Add(' /* Adjust the address for the data segment. We want to adjust up to');
Add(' the same address within the page on the next page up. */');
Add(' . = ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1));');
Add(' /* Exception handling */');
Add(' .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) }');
Add(' .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }');
Add(' /* Thread Local Storage sections */');
Add(' .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) }');
Add(' .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }');
Add(' .preinit_array :');
Add(' {');
Add(' PROVIDE_HIDDEN (__preinit_array_start = .);');
Add(' KEEP (*(.preinit_array))');
Add(' PROVIDE_HIDDEN (__preinit_array_end = .);');
Add(' }');
Add(' .init_array :');
Add(' {');
Add(' PROVIDE_HIDDEN (__init_array_start = .);');
Add(' KEEP (*(SORT(.init_array.*)))');
Add(' KEEP (*(.init_array))');
Add(' PROVIDE_HIDDEN (__init_array_end = .);');
Add(' }');
Add(' .fini_array :');
Add(' {');
Add(' PROVIDE_HIDDEN (__fini_array_start = .);');
Add(' KEEP (*(SORT(.fini_array.*)))');
Add(' KEEP (*(.fini_array))');
Add(' PROVIDE_HIDDEN (__fini_array_end = .);');
Add(' }');
Add(' .ctors :');
Add(' {');
Add(' /* gcc uses crtbegin.o to find the start of');
Add(' the constructors, so we make sure it is');
Add(' first. Because this is a wildcard, it');
Add(' doesn''t matter if the user does not');
Add(' actually link against crtbegin.o; the');
Add(' linker won''t look for a file to match a');
Add(' wildcard. The wildcard also means that it');
Add(' doesn''t matter which directory crtbegin.o');
Add(' is in. */');
Add(' KEEP (*crtbegin.o(.ctors))');
Add(' KEEP (*crtbegin?.o(.ctors))');
Add(' /* We don''t want to include the .ctor section from');
Add(' the crtend.o file until after the sorted ctors.');
Add(' The .ctor section from the crtend file contains the');
Add(' end of ctors marker and it must be last */');
Add(' KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))');
Add(' KEEP (*(SORT(.ctors.*)))');
Add(' KEEP (*(.ctors))');
Add(' }');
Add(' .dtors :');
Add(' {');
Add(' KEEP (*crtbegin.o(.dtors))');
Add(' KEEP (*crtbegin?.o(.dtors))');
Add(' KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))');
Add(' KEEP (*(SORT(.dtors.*)))');
Add(' KEEP (*(.dtors))');
Add(' }');
Add(' .jcr : { KEEP (*(.jcr)) }');
Add(' .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }');
Add(' .xt_except_table : ONLY_IF_RW { KEEP (*(.xt_except_table .xt_except_table.* .gnu.linkonce.e.*)) }');
Add(' .dynamic : { *(.dynamic) }');
Add(' .got : { *(.got) }');
Add(' .data :');
Add(' {');
Add(' *(.data .data.* .gnu.linkonce.d.*)');
Add(' SORT(CONSTRUCTORS)');
Add(' KEEP (*(.fpc .fpc.n_version .fpc.n_links))');
Add(' }');
Add(' .data1 : { *(.data1) }');
Add(' .xt_except_desc :');
Add(' {');
Add(' *(.xt_except_desc .xt_except_desc.* .gnu.linkonce.h.*)');
Add(' *(.xt_except_desc_end)');
Add(' }');
Add(' .lit4 :');
Add(' {');
Add(' PROVIDE (_lit4_start = .);');
Add(' *(.lit4 .lit4.* .gnu.linkonce.lit4.*)');
Add(' PROVIDE (_lit4_end = .);');
Add(' }');
Add(' _edata = .; PROVIDE (edata = .);');
Add(' __bss_start = .;');
Add(' .bss :');
Add(' {');
Add(' *(.dynbss)');
Add(' *(.bss .bss.* .gnu.linkonce.b.*)');
Add(' *(COMMON)');
Add(' /* Align here to ensure that the .bss section occupies space up to');
Add(' _end. Align after .bss to ensure correct alignment even if the');
Add(' .bss section disappears because there are no input sections.');
Add(' FIXME: Why do we need it? When there is no .bss section, we don''t');
Add(' pad the .data section. */');
Add(' . = ALIGN(. != 0 ? 32 / 8 : 1);');
Add(' }');
Add(' . = ALIGN(32 / 8);');
Add(' . = ALIGN(32 / 8);');
Add(' _end = .; PROVIDE (end = .);');
Add(' /* Stabs debugging sections. */');
Add(' .stab 0 : { *(.stab) }');
Add(' .stabstr 0 : { *(.stabstr) }');
Add(' .stab.excl 0 : { *(.stab.excl) }');
Add(' .stab.exclstr 0 : { *(.stab.exclstr) }');
Add(' .stab.index 0 : { *(.stab.index) }');
Add(' .stab.indexstr 0 : { *(.stab.indexstr) }');
Add(' .comment 0 : { *(.comment) }');
Add(' /* DWARF debug sections.');
Add(' Symbols in the DWARF debugging sections are relative to the beginning');
Add(' of the section so we begin them at 0. */');
Add(' /* DWARF 1 */');
Add(' .debug 0 : { *(.debug) }');
Add(' .line 0 : { *(.line) }');
Add(' /* GNU DWARF 1 extensions */');
Add(' .debug_srcinfo 0 : { *(.debug_srcinfo) }');
Add(' .debug_sfnames 0 : { *(.debug_sfnames) }');
Add(' /* DWARF 1.1 and DWARF 2 */');
Add(' .debug_aranges 0 : { *(.debug_aranges) }');
Add(' .debug_pubnames 0 : { *(.debug_pubnames) }');
Add(' /* DWARF 2 */');
Add(' .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }');
Add(' .debug_abbrev 0 : { *(.debug_abbrev) }');
Add(' .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) }');
Add(' .debug_frame 0 : { *(.debug_frame) }');
Add(' .debug_str 0 : { *(.debug_str) }');
Add(' .debug_loc 0 : { *(.debug_loc) }');
Add(' .debug_macinfo 0 : { *(.debug_macinfo) }');
Add(' /* SGI/MIPS DWARF 2 extensions */');
Add(' .debug_weaknames 0 : { *(.debug_weaknames) }');
Add(' .debug_funcnames 0 : { *(.debug_funcnames) }');
Add(' .debug_typenames 0 : { *(.debug_typenames) }');
Add(' .debug_varnames 0 : { *(.debug_varnames) }');
Add(' /* DWARF 3 */');
Add(' .debug_pubtypes 0 : { *(.debug_pubtypes) }');
Add(' .debug_ranges 0 : { *(.debug_ranges) }');
Add(' /* DWARF Extension. */');
Add(' .debug_macro 0 : { *(.debug_macro) }');
Add(' .debug_addr 0 : { *(.debug_addr) }');
Add(' .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }');
Add(' .xt.lit 0 : { KEEP (*(.xt.lit .xt.lit.* .gnu.linkonce.p.*)) }');
Add(' .xt.insn 0 : { KEEP (*(.xt.insn .gnu.linkonce.x.*)) }');
Add(' .xt.prop 0 : { KEEP (*(.xt.prop .xt.prop.* .gnu.linkonce.prop.*)) }');
Add(' /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }');
Add('}');
end;
{$endif XTENSA}
@ -1568,21 +1367,174 @@ end;
function TlinkerFreeRTOS.MakeExecutable:boolean;
var
StaticStr,
S,
binstr,
cmdstr,
mapstr: TCmdStr;
mapstr: Ansistring;
success : boolean;
StaticStr,
GCSectionsStr,
DynLinkStr,
StripStr,
FixedExeFileName: string;
t: Text;
hp: TCmdStrListItem;
filepath: TCmdStr;
begin
{ for future use }
StaticStr:='';
StripStr:='';
mapstr:='';
DynLinkStr:='';
Result:=false;
if target_info.system=system_xtensa_freertos then
begin
{ generate a sdkconfig.h if none is provided,
only a few fields are provided to far }
if not(Sysutils.FileExists('sdkconfig.h')) then
begin
Assign(t,'sdkconfig.h');
{$push}{$I-}
Rewrite(t);
if ioresult<>0 then
exit;
writeln(t,'#pragma once');
writeln(t,'#define CONFIG_APP_BUILD_USE_FLASH_SECTIONS 1');
writeln(t,'#define CONFIG_BT_RESERVE_DRAM 0x0');
writeln(t,'#define CONFIG_ESP32_ULP_COPROC_RESERVE_MEM 0');
writeln(t,'#define CONFIG_ESP32_TRACEMEM_RESERVE_DRAM 0x0');
Close(t);
if ioresult<>0 then
exit;
{$pop}
end;
{ generate an sdkconfig if none is provided,
this is a dummy so far }
if not(Sysutils.FileExists('sdkconfig')) then
begin
Assign(t,'sdkconfig');
{$push}{$I-}
Rewrite(t);
if ioresult<>0 then
exit;
writeln(t);
Close(t);
if ioresult<>0 then
exit;
{$pop}
end;
{ generate an kconfigs.in if none is provided,
this is a dummy so far }
if not(Sysutils.FileExists('kconfigs.in')) then
begin
Assign(t,'kconfigs.in');
{$push}{$I-}
Rewrite(t);
if ioresult<>0 then
exit;
writeln(t);
Close(t);
if ioresult<>0 then
exit;
{$pop}
end;
{ generate an kconfigs_projbuild.in if none is provided,
this is a dummy so far }
if not(Sysutils.FileExists('kconfigs_projbuild.in')) then
begin
Assign(t,'kconfigs_projbuild.in');
{$push}{$I-}
Rewrite(t);
if ioresult<>0 then
exit;
writeln(t);
Close(t);
if ioresult<>0 then
exit;
{$pop}
end;
{ generate a config.env if none is provided,
COMPONENT_KCONFIGS and COMPONENT_KCONFIGS_PROJBUILD are dummy fields and might
be needed to be filed properly }
if not(Sysutils.FileExists('config.env')) then
begin
Assign(t,'config.env');
{$push}{$I-}
Rewrite(t);
if ioresult<>0 then
exit;
writeln(t,'{');
writeln(t,' "COMPONENT_KCONFIGS": "",');
writeln(t,' "COMPONENT_KCONFIGS_PROJBUILD": "",');
writeln(t,' "IDF_CMAKE": "y",');
writeln(t,' "IDF_TARGET": "esp32",');
writeln(t,' "IDF_PATH": "'+GetEnvironmentVariable('IDF_PATH')+'",');
writeln(t,' "COMPONENT_KCONFIGS_SOURCE_FILE": "kconfigs.in",');
writeln(t,' "COMPONENT_KCONFIGS_PROJBUILD_SOURCE_FILE": "kconfigs_projbuild.in"');
writeln(t,'}');
Close(t);
if ioresult<>0 then
exit;
{$pop}
end;
{ generate ldgen_libraries }
Assign(t,'ldgen_libraries');
{$push}{$I-}
Rewrite(t);
if ioresult<>0 then
exit;
hp:=TCmdStrListItem(StaticLibFiles.First);
while assigned(hp) do
begin
FindLibraryFile(hp.Str,target_info.staticClibprefix,target_info.staticClibext,filepath);
writeln(t,filepath);
hp:=TCmdStrListItem(hp.Next);
end;
Close(t);
if ioresult<>0 then
exit;
{$pop}
binstr:='xtensa-esp32-elf-gcc';
cmdstr:='-C -P -x c -E -o esp32_out.ld -I . $IDF_PATH/components/esp32/ld/esp32.ld';
Replace(binstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
Replace(cmdstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
success:=DoExec(binstr,cmdstr,true,true);
{ generate linker maps for esp32 }
binstr:='$IDF_PATH/tools/ldgen/ldgen.py';
cmdstr:='--config sdkconfig --fragments $IDF_PATH/components/xtensa/linker.lf $IDF_PATH/components/soc/linker.lf $IDF_PATH/components/esp_event/linker.lf '+
'$IDF_PATH/components/spi_flash/linker.lf $IDF_PATH/components/esp_wifi/linker.lf $IDF_PATH/components/lwip/linker.lf $IDF_PATH/components/log/linker.lf '+
'$IDF_PATH/components/heap/linker.lf $IDF_PATH/components/esp_ringbuf/linker.lf $IDF_PATH/components/espcoredump/linker.lf $IDF_PATH/components/esp32/linker.lf '+
'$IDF_PATH/components/esp32/ld/esp32_fragments.lf $IDF_PATH/components/freertos/linker.lf $IDF_PATH/components/newlib/newlib.lf '+
'$IDF_PATH/components/app_trace/linker.lf $IDF_PATH/components/esp_gdbstub/linker.lf '+
'--input $IDF_PATH/components/esp32/ld/esp32.project.ld.in --output ./esp32.project.ld --kconfig $IDF_PATH/Kconfig --env-file config.env '+
'--libraries-file ldgen_libraries --objdump xtensa-esp32-elf-objdump';
Replace(binstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
Replace(cmdstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
if success and not(cs_link_nolink in current_settings.globalswitches) then
success:=DoExec(binstr,cmdstr,true,false);
end;
FixedExeFileName:=maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.elf')));
GCSectionsStr:='--gc-sections';
@ -1591,7 +1543,7 @@ begin
Message1(exec_i_linking,current_module.exefilename);
if (cs_link_map in current_settings.globalswitches) then
mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
{ Write used files and libraries }
WriteResponseFile();
@ -1599,6 +1551,8 @@ begin
{ Call linker }
SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
Replace(cmdstr,'$OPT',Info.ExtraOptions);
if target_info.system=system_xtensa_freertos then
Replace(cmdstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
if not(cs_link_on_target in current_settings.globalswitches) then
begin
Replace(cmdstr,'$EXE',FixedExeFileName);
@ -1619,7 +1573,8 @@ begin
Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
Replace(cmdstr,'$DYNLINK',DynLinkStr);
end;
success:=DoExec(FindUtil(utilsprefix+BinStr),cmdstr,true,false);
if success and not(cs_link_nolink in current_settings.globalswitches) then
success:=DoExec(FindUtil(utilsprefix+BinStr),cmdstr,true,false);
{ Remove ReponseFile }
if success and not(cs_link_nolink in current_settings.globalswitches) then
@ -1629,16 +1584,22 @@ begin
if success and not(cs_link_nolink in current_settings.globalswitches) then
success:=PostProcessExecutable(FixedExeFileName,false);
if success and (target_info.system in [system_arm_embedded,system_avr_embedded,system_mipsel_embedded,system_xtensa_embedded]) then
if success and (target_info.system=system_xtensa_freertos) then
begin
success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O ihex '+
binstr:='$IDF_PATH/components/esptool_py/esptool/esptool.py';
Replace(binstr,'$IDF_PATH',maybequoted(GetEnvironmentVariable('IDF_PATH')));
success:=DoExec(binstr,'--chip esp32 elf2image --flash_mode dio --flash_freq 40m '+
'--flash_size '+tostr(embedded_controllers[current_settings.controllertype].flashsize div (1024*1024))+'MB '+
'--elf-sha256-offset 0xb0 '+
'-o '+maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin')))+' '+
FixedExeFileName,
true,false);
end
else
if success then
success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O binary '+
FixedExeFileName+' '+
maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.hex'))),true,false);
if success then
success:=DoExec(FindUtil(utilsprefix+'objcopy'),'-O binary '+
FixedExeFileName+' '+
maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin'))),true,false);
end;
maybequoted(ScriptFixFileName(ChangeFileExt(current_module.exefilename,'.bin'))),true,false);
MakeExecutable:=success; { otherwise a recursive call to link method }
end;