The manifest skeleton files like usr.manifest.skel have an entry for libgcc_s_dir looking like this:
/usr/lib/libgcc_s.so.1: %(libgcc_s_dir)s/libgcc_s.so.1 This actually gets expanded quite late during the build process by upload_manifest.py. The unfortunate consequence of this is that loader.py used during debugging which reads usr.manifest does not have any logic to load libgcc_s.so.1. And this makes stack traces look useless in those cases that involve libgcc_s.so.1. So this patch slightly changes the scripts/build and scripts/module.py to expand %(libgcc_s_dir) when writing to build/release/usr.manifest. As a result of this the stack trace of the crash I have been working on looks much more reasonable: (gdb) bt '#0 0x00000000403047c2 in processor::cli_hlt () at arch/x64/processor.hh:247 #1 arch::halt_no_interrupts () at arch/x64/arch.hh:48 #2 osv::halt () at arch/x64/power.cc:29 #3 0x0000000040239504 in abort (fmt=fmt@entry=0x405b1e93 "Aborted\n") at runtime.cc:142 #4 0x0000000040202e80 in abort () at runtime.cc:106 #5 0x000010000002b6b6 in ?? () #6 0x000010000003f5cb in _Unwind_Resume () #7 0x0000100000062daa in ?? () #8 0x0000100000075b5c in boost::execution_monitor::vexecute(boost::function<void ()> const&) () #9 0x000010000007f0a9 in boost::unit_test::framework::init(bool (*)(), int, char**) () #10 0x000010000009254d in boost::unit_test::unit_test_main(bool (*)(), int, char**) () #11 0x000000004039d021 in osv::application::run_main (this=0xffffa00000bd8c10) at core/app.cc:416 #12 0x000000004039d22d in operator() (app=<optimized out>, __closure=0x0) at core/app.cc:236 #13 _FUN () at core/app.cc:238 #14 0x00000000403d089a in operator() (__closure=0xffffa00000d57800) at libc/pthread.cc:116 #15 std::__invoke_impl<void, pthread_private::pthread::pthread(void* (*)(void*), void*, sigset_t, const pthread_private::thread_attr*)::<lambda()>&> (__f=...) at /usr/include/c++/11/bits/invoke.h:61 #16 std::__invoke_r<void, pthread_private::pthread::pthread(void* (*)(void*), void*, sigset_t, const pthread_private::thread_attr*)::<lambda()>&> (__fn=...) at /usr/include/c++/11/bits/invoke.h:154 #17 std::_Function_handler<void(), pthread_private::pthread::pthread(void* (*)(void*), void*, sigset_t, const pthread_private::thread_attr*)::<lambda()> >::_M_invoke(const std::_Any_data &) (__functor=...) at /usr/include/c++/11/bits/std_function.h:290 #18 0x000000004036b5ae in sched::thread::main (this=0xffff800000f6a040) at core/sched.cc:1267 #19 sched::thread_main_c (t=0xffff800000f6a040) at arch/x64/arch-switch.hh:325 #20 0x00000000402fda43 in thread_main () at arch/x64/entry.S:116 Signed-off-by: Waldemar Kozaczuk <jwkozac...@gmail.com> --- scripts/build | 32 ++++++++++++++++---------------- scripts/module.py | 11 +++++++---- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/scripts/build b/scripts/build index 38aa70d5..fbfe0ae3 100755 --- a/scripts/build +++ b/scripts/build @@ -227,6 +227,21 @@ if [[ ${vars[append_manifest]} == "true" && $modules == "!default" ]]; then modules="empty" fi +CC=gcc +if [[ "$host_arch" == "x86_64" && "$arch" == 'aarch64' ]]; then + CC=${CROSS_PREFIX:-aarch64-linux-gnu-}gcc +fi + +libgcc_s_path=$(${CC} -print-file-name=libgcc_s.so.1) +if [[ "$libgcc_s_path" == "libgcc_s.so.1" ]]; then + cat <<-EOF + Unable to resolve libgcc_s.so.1 using "${CC}". + Looking in build/downloaded_packages/aarch64/gcc/install/lib64 + EOF + libgcc_s_path="build/downloaded_packages/aarch64/gcc/install/lib64/libgcc_s.so.1" +fi +libgcc_s_dir=$(dirname $(readlink -f ${libgcc_s_path})) + # The parentheses start a subshell. Whatever is exported there, doesn't affect the external shell ( # Note: the double-quotes and almost everything in the line below is important to correctly allow spaces @@ -240,7 +255,7 @@ fi esac done # Export the variables we already have. This makes it unnecessary to do "fs__type=$fstype ..." - export fs_type mode OSV_BUILD_PATH + export fs_type mode OSV_BUILD_PATH libgcc_s_dir # Other variables we wanted to rename, I don't know why export ARCH=$arch OSV_BASE=$SRC # Run what we wanted to run. It will inherit everything we exported above. @@ -276,21 +291,6 @@ kernel_end=$(($loader_size+2097151 & ~2097151)) # the case in our old build.mk). cd $OUT -CC=gcc -if [[ "$host_arch" == "x86_64" && "$arch" == 'aarch64' ]]; then - CC=${CROSS_PREFIX:-aarch64-linux-gnu-}gcc -fi - -libgcc_s_path=$(${CC} -print-file-name=libgcc_s.so.1) -if [[ "$libgcc_s_path" == "libgcc_s.so.1" ]]; then - cat <<-EOF - Unable to resolve libgcc_s.so.1 using "${CC}". - Looking in ../downloaded_packages/aarch64/gcc/install/lib64 - EOF - libgcc_s_path="../downloaded_packages/aarch64/gcc/install/lib64/libgcc_s.so.1" -fi -libgcc_s_dir=$(dirname $(readlink -f ${libgcc_s_path})) - if [ "$export" != "none" ]; then export_dir=${vars[export_dir]-$SRC/build/export} "$SRC"/scripts/export_manifest.py -e "$export_dir" -m usr.manifest -D libgcc_s_dir="$libgcc_s_dir" diff --git a/scripts/module.py b/scripts/module.py index 8a1a5406..fec80987 100755 --- a/scripts/module.py +++ b/scripts/module.py @@ -57,12 +57,15 @@ def expand(text, variables): return re.sub(r'\${(?P<name>.*)}', resolve, text) -def append_manifest(file_path, dst_file, variables={}): +def append_manifest(file_path, dst_file, libgcc_s_dir, variables={}): with open(file_path) as src_file: for line in src_file: line = line.rstrip() if line != '[manifest]': - dst_file.write(expand(line + '\n', variables)) + expanded_line = expand(line + '\n', variables) + if len(libgcc_s_dir) > 0: + expanded_line = expanded_line.replace('%(libgcc_s_dir)s',libgcc_s_dir) + dst_file.write(expanded_line) def generate_manifests(modules, basic_apps, usrskel='default'): for manifest_type in ["usr", "bootfs"]: @@ -77,14 +80,14 @@ def generate_manifests(modules, basic_apps, usrskel='default'): manifest.write('[manifest]\n') if manifest_skel != 'none': - append_manifest(os.path.join(resolve.get_osv_base(), manifest_skel), manifest) + append_manifest(os.path.join(resolve.get_osv_base(), manifest_skel), manifest, os.getenv('libgcc_s_dir')) for module in modules: module_manifest = os.path.join(module.local_path, manifest_name) if os.path.exists(module_manifest): print("Appending %s to %s" % (module_manifest, manifest_name)) - append_manifest(module_manifest, manifest, variables={ + append_manifest(module_manifest, manifest, os.getenv('libgcc_s_dir'), variables={ 'MODULE_DIR': module.local_path, 'OSV_BASE': resolve.get_osv_base() }) -- 2.34.1 -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to osv-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/20220511015843.33294-1-jwkozaczuk%40gmail.com.