chromiumembedded / cef

Chromium Embedded Framework (CEF). A simple framework for embedding Chromium-based browsers in other applications.
https://bitbucket.org/chromiumembedded/cef/
Other
3.09k stars 450 forks source link

mac: "Finding exported symbols" step fails to read .a files due to "unknown-unsupported file format" (M124) #3674

Closed magreenblatt closed 3 months ago

magreenblatt commented 3 months ago

Describe the bug Build cef_sandbox on Mac as described here. The make_distrib step fails with:

Finding exported symbols...
-------- Running "ld -arch x86_64 -r -o "/tmp/build/chromium/src/cef/binary_distrib/cef_binary_124.0.0-master.2924+g52dac91+chromium-124.0.6367.0_macosx64/Debug/cef_sandbox.o" -exported_symbol __ZN23CefScopedSandboxContext10InitializeEiPPc -exported_symbol __ZN23CefScopedSandboxContextC1Ev -exported_symbol __ZN23CefScopedSandboxContextC2Ev -exported_symbol __ZN23CefScopedSandboxContextD1Ev -exported_symbol __ZN23CefScopedSandboxContextD2Ev -exported_symbol _cef_sandbox_destroy -exported_symbol _cef_sandbox_initialize "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/cef/libcef_sandbox.a" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/sandbox/mac/libseatbelt.a" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/sandbox/mac/libseatbelt_proto.a" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/third_party/protobuf/libprotobuf_lite.a" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/algorithm.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/any.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/atomic.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/barrier.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/bind.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/call_once.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/charconv.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/chrono.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/condition_variable.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/condition_variable_destructor.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/d2fixed.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/d2s.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/directory_iterator.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/error_category.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/exception.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/f2s.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/filesystem_error.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/functional.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/future.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/hash.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/ios.instantiations.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/ios.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/iostream.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/legacy_pointer_safety.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/locale.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/memory.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/mutex.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/mutex_destructor.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/new.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/new_handler.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/new_helpers.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/operations.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/optional.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/path.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/random.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/random_shuffle.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/regex.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/shared_mutex.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/stdexcept.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/string.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/strstream.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/system_error.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/thread.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/typeinfo.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/valarray.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/variant.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/vector.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++/libc++/verbose_abort.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/abort_message.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_aux_runtime.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_default_handlers.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_demangle.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_exception.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_exception_storage.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_guard.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_handlers.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_personality.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_vector.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/cxa_virtual.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/fallback_malloc.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/private_typeinfo.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/stdlib_exception.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/stdlib_stdexcept.o" "/tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/buildtools/third_party/libc++abi/libc++abi/stdlib_typeinfo.o"" in "/tmp/build/chromium/src/cef/tools"...
ld: warning: ld: warning: ignoring file /tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/cef/libcef_sandbox.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x74 0x68 0x69 0x6E 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
ld: warning: ld: warning: ignoring file /tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/sandbox/mac/libseatbelt.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x74 0x68 0x69 0x6E 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
ignoring file /tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/third_party/protobuf/libprotobuf_lite.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x74 0x68 0x69 0x6E 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
ignoring file /tmp/build/chromium/src/out/Debug_GN_x64_sandbox/obj/sandbox/mac/libseatbelt_proto.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x74 0x68 0x69 0x6E 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
Undefined symbols for architecture x86_64:
  "__ZN23CefScopedSandboxContext10InitializeEiPPc", referenced from:
     -exported_symbol[s_list] command line option
  "__ZN23CefScopedSandboxContextC1Ev", referenced from:
     -exported_symbol[s_list] command line option
  "__ZN23CefScopedSandboxContextC2Ev", referenced from:
     -exported_symbol[s_list] command line option
  "__ZN23CefScopedSandboxContextD1Ev", referenced from:
     -exported_symbol[s_list] command line option
  "__ZN23CefScopedSandboxContextD2Ev", referenced from:
     -exported_symbol[s_list] command line option
  "_cef_sandbox_destroy", referenced from:
     -exported_symbol[s_list] command line option
  "_cef_sandbox_initialize", referenced from:
     -exported_symbol[s_list] command line option
ld: symbol(s) not found for architecture x86_64

Expected behavior All steps should succeed.

Versions (please complete the following information):

Additional context Chromium builds with lld by default (GN arg use_lld=true). A recent change enabled the use of thin archives (-T argument) with lld. However, the system/Xcode version of "ld" does not appear to support thin archives. This is confirmed by the error message, where the hex value means "thin archive":

unknown-unsupported file format ( 0x21 0x3C 0x74 0x68 0x69 0x6E 0x3E 0x0A 0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )

Building cef_sandbox with use_lld=false also fails:

% ninja -C out/Debug_GN_x64_sandbox cef_sandbox
ninja: Entering directory `out/Debug_GN_x64_sandbox'
[272/284] LINK ./protoc
FAILED: protoc 
TOOL_VERSION=1689989814 ../../build/toolchain/apple/linker_driver.py -Wcrl,driver,../../third_party/llvm-build/Release+Asserts/bin/clang++ -B /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ -Wcrl,strippath,/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip -Wcrl,installnametoolpath,../../third_party/llvm-build/Release+Asserts/bin/install_name_tool  -Wl,-fatal_warnings --target=x86_64-apple-macos -no-canonical-prefixes -nostdlib++ -isysroot ../../../../../../../../Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.0.sdk -mmacos-version-min=10.15 -Wl,-ObjC -Werror -o "./protoc" "@./protoc.rsp" 
ld: warning: ignoring duplicate libraries: '../../third_party/llvm-build/Release+Asserts/lib/clang/19/lib/darwin/libclang_rt.osx.a'
ld: fatal warning(s) induced error (-fatal_warnings)

Additonally, shipping thin archives (which contain just the symbol table and the path to find the original .o files) would cause issues for client applications.

magreenblatt commented 3 months ago

Related to issue #2470 where we disabled thin archive support on Windows.

It's likely sufficient to disable thin archives for the cef_sandbox build only, since that's the only archive that we distribute with the CEF binary distribution.

magreenblatt commented 2 months ago

ld: warning: ignoring duplicate libraries: '../../third_party/llvm-build/Release+Asserts/lib/clang/19/lib/darwin/libclang_rt.osx.a' ld: fatal warning(s) induced error (-fatal_warnings)

That can be fixed by adding GN arg fatal_linker_warnings=false

kromain commented 1 month ago

Looks like https://github.com/chromiumembedded/cef/commit/54a9c26b92271ca060793ed3de5348bb0f42c06c broke #2470 again, as the new logic now just accounts for cef_sandbox while restoring the initial is_win && use_lld block. As a result, I've started seeing the same error as #2470 when running make_distrib from M125 on Windows.

But at least now there's a GN arg exposed so I could fix the packaging by adding use_thin_archives=false to my GN_DEFINES (at the cost of a rebuild though). Still, might be worth adjusting the patch to disable the option by default for windows to retain the previous behavior.

magreenblatt commented 1 month ago

Looks like https://github.com/chromiumembedded/cef/commit/54a9c26b92271ca060793ed3de5348bb0f42c06c broke https://github.com/chromiumembedded/cef/issues/2470 again

Sorry about that. You can create a compatible cef_sandbox build by following the instructions here. Or, build for distribution using the Official/automated instructions here.

kromain commented 1 month ago

oh I see, we weren't building the cef_sandbox target in the separate *__GN_x64_sandbox folder (for reasons unknown to me), and it was working by chance until your latest patch. If I build it there then the make_distrib.py script will pick that one up for combine_libs instead of the regular build folder. Now it makes sense, thanks for the pointer!