Hi all.
A couple of notes:
- armv6/7/7l repos have been replaced by an armhf repo, which contains 32 bit extensions
- When using 32bit images, the pi4 and pi5 will use a 64bit kernel. please make sure to look at uname if manually downloading kernel module extensions. The 32bit armv7l kernel for the Pi4 is optional if you edit the config.txt on the boot drive.
What's the proper compile flags for
armhf after the merge ? (I have 3B and 4B)
I'm planning to build distcc, firefox-perf for both 32-bit and 64-bit.
I'll need several other extensions, starting with lld from llvm on armhf.
I'm having trouble figuring out the proper triplet.
Clang is unhappy with my input in general.
I'm currently running on a fresh installation of armhf.
The test below is performed with (tce-load -wil compiletc clang)
tc@pi4-1:/tmp/tmp.wXoY5k$ ls
return_0.c
tc@pi4-1:/tmp/tmp.wXoY5k$ cat return_0.c
int main(void) {
return 0;
}
tc@pi4-1:/tmp/tmp.wXoY5k$ gcc return_0.c -o gcc-no-arg
# compiles without trouble
tc@pi4-1:/tmp/tmp.wXoY5k$ clang return_0.c -o clang-no-arg
/usr/local/bin/ld: cannot find crtbeginS.o: No such file or directory
/usr/local/bin/ld: cannot find -lgcc: No such file or directory
/usr/local/bin/ld: cannot find -lgcc: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)
tc@pi4-1:/tmp/tmp.wXoY5k$ realpath /usr/local/bin/ld
/tmp/tcloop/binutils/usr/local/bin/ld
Passing
"--verbose" to the linker
tc@pi4-1:/tmp/tmp.wXoY5k$ clang return_0.c -o clang-verbose -Wl,--verbose
GNU ld (GNU Binutils) 2.42
Supported emulations:
armelf_linux_eabi
armelfb_linux_eabi
using internal linker script:
==================================================
/* Script for -pie -z combreloc */
/* Copyright (C) 2014-2024 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-littlearm", "elf32-bigarm",
"elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SEARCH_DIR("/usr/local/armv7l-unknown-linux-gnueabihf/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
SECTIONS
{
/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0)); . = SEGMENT_START("text-segment", 0) + SIZEOF_HEADERS;
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rel.dyn :
{
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data.rel.ro .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
*(.rel.iplt)
}
.rela.dyn :
{
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
*(.rela.iplt)
}
.rel.plt :
{
*(.rel.plt)
}
.rela.plt :
{
*(.rela.plt)
}
.init :
{
KEEP (*(SORT_NONE(.init)))
}
.plt : { *(.plt) }
.iplt : { *(.iplt) }
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(SORT(.text.sorted.*))
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf.em. */
*(.gnu.warning)
*(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.v4_bx)
}
.fini :
{
KEEP (*(SORT_NONE(.fini)))
}
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
.ARM.exidx :
{
PROVIDE_HIDDEN (__exidx_start = .);
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
PROVIDE_HIDDEN (__exidx_end = .);
}
.eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) }
.sframe : ONLY_IF_RO { *(.sframe) *(.sframe.*) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
.gnu_extab : ONLY_IF_RO { *(.gnu_extab*) }
/* These sections are generated by the Sun/Oracle C++ compiler. */
.exception_ranges : ONLY_IF_RO { *(.exception_ranges*) }
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. */
. = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE));
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) }
.sframe : ONLY_IF_RW { *(.sframe) *(.sframe.*) }
.gnu_extab : ONLY_IF_RW { *(.gnu_extab) }
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
.exception_ranges : ONLY_IF_RW { *(.exception_ranges*) }
/* Thread Local Storage sections */
.tdata :
{
PROVIDE_HIDDEN (__tdata_start = .);
*(.tdata .tdata.* .gnu.linkonce.td.*)
}
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
}
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
PROVIDE_HIDDEN (__init_array_end = .);
}
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
PROVIDE_HIDDEN (__fini_array_end = .);
}
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
}
.jcr : { KEEP (*(.jcr)) }
.data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }
.dynamic : { *(.dynamic) }
. = DATA_SEGMENT_RELRO_END (0, .);
.got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) }
.data :
{
PROVIDE (__data_start = .);
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
}
.data1 : { *(.data1) }
_edata = .; PROVIDE (edata = .);
. = ALIGN(ALIGNOF(NEXT_SECTION));
__bss_start = .;
__bss_start__ = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections.
FIXME: Why do we need it? When there is no .bss section, we do not
pad the .data section. */
. = ALIGN(. != 0 ? 32 / 8 : 1);
}
_bss_end__ = .; __bss_end__ = .;
. = ALIGN(32 / 8);
. = SEGMENT_START("ldata-segment", .);
. = ALIGN(32 / 8);
__end__ = .;
_end = .; PROVIDE (end = .);
. = DATA_SEGMENT_END (.);
/* 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 (INFO) : { *(.comment); LINKER_VERSION; }
.gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
/* 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 5. */
.debug_addr 0 : { *(.debug_addr) }
.debug_line_str 0 : { *(.debug_line_str) }
.debug_loclists 0 : { *(.debug_loclists) }
.debug_macro 0 : { *(.debug_macro) }
.debug_names 0 : { *(.debug_names) }
.debug_rnglists 0 : { *(.debug_rnglists) }
.debug_str_offsets 0 : { *(.debug_str_offsets) }
.debug_sup 0 : { *(.debug_sup) }
.gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
}
==================================================
/usr/local/bin/ld: mode armelf_linux_eabi
attempt to open /usr/lib/../lib/Scrt1.o succeeded
/usr/lib/../lib/Scrt1.o
attempt to open /usr/lib/../lib/crti.o succeeded
/usr/lib/../lib/crti.o
attempt to open crtbeginS.o failed
/usr/local/bin/ld: cannot find crtbeginS.o: No such file or directory
attempt to open /tmp/return_0-b5ecd2.o succeeded
/tmp/return_0-b5ecd2.o
attempt to open /lib/../lib/libgcc.so failed
attempt to open /lib/../lib/libgcc.a failed
attempt to open /usr/lib/../lib/libgcc.so failed
attempt to open /usr/lib/../lib/libgcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/libgcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/libgcc.a failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/libgcc.so failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/libgcc.a failed
attempt to open /usr/local/lib/libgcc.so failed
attempt to open /usr/local/lib/libgcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/libgcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/libgcc.a failed
/usr/local/bin/ld: cannot find -lgcc: No such file or directory
attempt to open /lib/../lib/libgcc.so failed
attempt to open /lib/../lib/gcc.a failed
attempt to open /usr/lib/../lib/libgcc.so failed
attempt to open /usr/lib/../lib/gcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/gcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/gcc.a failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/libgcc.so failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/gcc.a failed
attempt to open /usr/local/lib/libgcc.so failed
attempt to open /usr/local/lib/gcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/gcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/gcc.a failed
attempt to open /lib/../lib/libgcc_s.so failed
attempt to open /lib/../lib/libgcc_s.a failed
attempt to open /usr/lib/../lib/libgcc_s.so succeeded
opened script file /usr/lib/../lib/libgcc_s.so
/usr/lib/../lib/libgcc_s.so
opened script file /usr/lib/../lib/libgcc_s.so
attempt to open /usr/lib/../lib/libgcc_s.so.1 succeeded
/usr/lib/../lib/libgcc_s.so.1
attempt to open /lib/../lib/libgcc.so failed
attempt to open /lib/../lib/libgcc.a failed
attempt to open /usr/lib/../lib/libgcc.so failed
attempt to open /usr/lib/../lib/libgcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/libgcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/libgcc.a failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/libgcc.so failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/libgcc.a failed
attempt to open /usr/local/lib/libgcc.so failed
attempt to open /usr/local/lib/libgcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/libgcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/libgcc.a failed
/usr/local/bin/ld: cannot find -lgcc: No such file or directory
attempt to open /lib/../lib/libgcc.so failed
attempt to open /lib/../lib/gcc.a failed
attempt to open /usr/lib/../lib/libgcc.so failed
attempt to open /usr/lib/../lib/gcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/gcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/gcc.a failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/libgcc.so failed
attempt to open /usr/local/armv7l-unknown-linux-gnueabihf/lib/gcc.a failed
attempt to open /usr/local/lib/libgcc.so failed
attempt to open /usr/local/lib/gcc.a failed
attempt to open /lib/libgcc.so failed
attempt to open /lib/gcc.a failed
attempt to open /usr/lib/libgcc.so failed
attempt to open /usr/lib/gcc.a failed
clang: error: linker command failed with exit code 1 (use -v to see invocation)
The location of
crtbeginS.otc@pi4-1:/tmp/tmp.wXoY5k$ find /tmp/tcloop/gcc -name crtbeginS.o
/tmp/tcloop/gcc/usr/local/lib/gcc/armv7l-unknown-linux-gnueabihf/13.2.0/crtbeginS.o