Summary: | out of file descriptors and couldn't close any | ||
---|---|---|---|
Product: | binutils | Reporter: | Martin Liška <marxin.liska> |
Component: | gold | Assignee: | Cary Coutant <ccoutant> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | ccoutant, hjl.tools, markus, rafael |
Priority: | P2 | ||
Version: | 2.23 | ||
Target Milestone: | --- | ||
Host: | Target: | ||
Build: | Last reconfirmed: | ||
Attachments: | ld args and liblto plugin |
Description
Martin Liška
2013-06-20 20:43:01 UTC
What does "ulimit -n" display? Is there any way that you can shrink the extent of the --start-group/--end-group options? My first guess is that it's related to having all those files inside the library group. In particular, .o files do not need to be inside the group. It might be better to build a thin archive from all those .a files, then just link against the thin archive (the linker will treat all the nested member libraries as one giant archive library). ulimit -n 1024 I tried same command line without --start-group/--end-group, but didn't help. Next step was to create one large archive, so: ar r [list of all *.a] /tmp/lib.a g++ -Wl,-z,now -Wl,-z,relro -pthread -Wl,-z,noexecstack -fPIC -pie -L. -flto=9 -fno-fat-lto-objects -O2 --param lto-partitions=64 -o chrome obj/chrome/app/chrome.chrome_exe_main_gtk.o obj/chrome/app/chrome.chrome_main.o obj/chrome/app/chrome.chrome_main_delegate.o /tmp/lib.a -lX11 -lXcursor -lXrandr -lXrender -lXss -lXext -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lXtst -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lXi -lsmime3 -lnssutil3 -lnss3 -lplds4 -lplc4 -lnspr4 -lgconf-2 -lresolv -lXcomposite -lasound -lXdamage -lXfixes -lcups -lgnutls -lgcrypt -lgpg-error -lz -lpthread -lcrypt -lm -L/usr/lib64 -lexpat -ldbus-1 -ludev I was shown big amount of undefined symbols, did I use the correct way how to create the archive? Thanks, Martin > Next step was to create one large archive, so: > > ar r [list of all *.a] /tmp/lib.a > > g++ -Wl,-z,now -Wl,-z,relro -pthread -Wl,-z,noexecstack -fPIC -pie -L. -flto=9 > -fno-fat-lto-objects -O2 --param lto-partitions=64 -o chrome > obj/chrome/app/chrome.chrome_exe_main_gtk.o obj/chrome/app/chrome.chrome_main.o > obj/chrome/app/chrome.chrome_main_delegate.o /tmp/lib.a -lX11 -lXcursor > -lXrandr -lXrender -lXss -lXext -lrt -ldl -lgmodule-2.0 -lgobject-2.0 > -lgthread-2.0 -lglib-2.0 -lXtst -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 > -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype > -lfontconfig -lXi -lsmime3 -lnssutil3 -lnss3 -lplds4 -lplc4 -lnspr4 -lgconf-2 > -lresolv -lXcomposite -lasound -lXdamage -lXfixes -lcups -lgnutls -lgcrypt > -lgpg-error -lz -lpthread -lcrypt -lm -L/usr/lib64 -lexpat -ldbus-1 -ludev > > I was shown big amount of undefined symbols, did I use the correct way how to > create the archive? You need the 'T' option to make a thin archive. Otherwise an archive of other archives makes a plain non-library archive file. -cary I did so, thin library was created, but linker is still complaining about file descriptors: g++ -Wl,-z,now -Wl,-z,relro -pthread -Wl,-z,noexecstack -fPIC -pie -L. -flto=9 -fno-fat-lto-objects -O2 --param lto-partitions=64 -o chrome obj/chrome/app/chrome.chrome_exe_main_gtk.o obj/chrome/app/chrome.chrome_main.o obj/chrome/app/chrome.chrome_main_delegate.o lib.a -lX11 -lXcursor -lXrandr -lXrender -lXss -lXext -lrt -ldl -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lXtst -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lXi -lsmime3 -lnssutil3 -lnss3 -lplds4 -lplc4 -lnspr4 -lgconf-2 -lresolv -lXcomposite -lasound -lXdamage -lXfixes -lcups -lgnutls -lgcrypt -lgpg-error -lz -lpthread -lcrypt -lm -L/usr/lib64 -lexpat -ldbus-1 -ludev Does the problem only happen with -flto? I wonder if the plugin is keeping files open. Can you tar up the build directory so I can try to repro the problem? -cary On Thu, Jun 20, 2013 at 1:43 PM, marxin.liska at gmail dot com <sourceware-bugzilla@sourceware.org> wrote: > http://sourceware.org/bugzilla/show_bug.cgi?id=15660 > > Bug ID: 15660 > Summary: out of file descriptors and couldn't close any > Product: binutils > Version: 2.23 > Status: NEW > Severity: normal > Priority: P2 > Component: gold > Assignee: ian at airs dot com > Reporter: marxin.liska at gmail dot com > CC: ccoutant at google dot com > > I've encountered similar bug to: > http://sourceware.org/bugzilla/show_bug.cgi?id=10708 during linking of chromium > binary. > > ld --version > GNU gold (GNU Binutils 2.23.52.20130526) 1.11 > > Command line: > FAILED: flock linker.lock g++ -Wl,-z,now -Wl,-z,relro -pthread > -Wl,-z,noexecstack -fPIC -pie -L. -flto=9 -fno-fat-lto-objects -O2 --param > lto-partitions=64 -o chrome -Wl,--start-group > obj/chrome/app/chrome.chrome_exe_main_gtk.o obj/chrome/app/chrome.chrome_main.o > obj/chrome/app/chrome.chrome_main_delegate.o obj/chrome/libinstaller_util.a > obj/media/libmedia_sse.a obj/third_party/icu/libicuuc.a > obj/third_party/libjingle/libjingle.a obj/skia/libskia_opts.a > obj/third_party/icu/libicudata.a obj/device/libdevice_media_transfer_protocol.a > obj/native_client/src/trusted/service_runtime/arch/x86/libservice_runtime_x86_common.a > obj/chrome/libservice.a obj/chrome/librenderer.a obj/webkit/support/libglue.a > obj/content/libcontent_worker.a obj/third_party/libwebp/libwebp_utils.a > obj/third_party/zlib/libminizip.a > obj/chrome/browser/performance_monitor/libperformance_monitor.a > obj/third_party/leveldatabase/libleveldatabase.a > obj/native_client/src/trusted/service_runtime/libenv_cleanser.a > obj/sandbox/libc_urandom_override.a obj/chrome/libbrowser.a > obj/ppapi/libppapi_host.a obj/sync/libsync_core.a obj/gpu/libgles2_cmd_helper.a > obj/third_party/smhasher/libcityhash.a > obj/third_party/libphonenumber/libphonenumber.a > obj/chrome/app/policy/libpolicy.a obj/webkit/support/libplugins_common.a > obj/native_client/src/trusted/validator_x86/libnccopy_x86_64.a > obj/webkit/support/libglue_common.a > obj/webkit/renderer/compositor_bindings/libwebkit_compositor_support.a > obj/third_party/smhasher/libmurmurhash3.a obj/content/libcontent_gpu.a > obj/native_client/src/trusted/threading/libthread_interface.a > obj/media/libmedia_mmx.a obj/ipc/libipc.a obj/third_party/libxslt/libxslt.a > obj/remoting/libremoting_client.a obj/third_party/ots/libots.a > obj/base/libsymbolize.a obj/native_client/src/trusted/validator/libvalidators.a > obj/chrome/libbrowser_extensions.a obj/skia/libskia_opts_ssse3.a > obj/third_party/protobuf/libprotobuf_lite.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_platform.a > obj/ui/surface/libsurface.a > obj/third_party/WebKit/Source/WebKit/chromium/libwebkit.a > obj/native_client/src/trusted/validator/x86/64/libncvalidate_x86_64.a > obj/third_party/jsoncpp/libjsoncpp.a obj/google_apis/libgoogle_apis.a > obj/chrome/libnacl.a > obj/third_party/libphonenumber/libphonenumber_without_metadata.a > obj/chrome/libdebugger.a obj/v8/tools/gyp/libv8_snapshot.a > obj/ui/native_theme/libnative_theme.a obj/third_party/libusb/libusb.a > obj/content/libcontent_common_child.a > obj/native_client/src/trusted/nacl_base/libnacl_base.a > obj/base/libbase_static.a obj/native_client/src/shared/imc/libimc.a > obj/chrome/libfeedback_proto.a > obj/components/libbrowser_context_keyed_service.a obj/components/libweb_modal.a > obj/chrome/libapps.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_platform_geometry.a > obj/components/libuser_prefs.a obj/content/libcontent_utility.a > obj/third_party/libevent/libevent.a obj/sandbox/libseccomp_bpf.a > obj/build/linux/libpci.a obj/ui/gl/libgl_wrapper.a > obj/third_party/mt19937ar/libmt19937ar.a > obj/third_party/angle/src/libtranslator_common.a > obj/ui/message_center/libmessage_center.a obj/third_party/libpng/libpng.a > obj/components/libwebdata_common.a obj/third_party/opus/libopus.a > obj/sync/libsync_notifier.a obj/ui/snapshot/libsnapshot.a > obj/native_client/src/trusted/validator/x86/libncval_base_x86_64.a > obj/webkit/support/libwebkit_media.a obj/third_party/libwebp/libwebp_dsp.a > obj/third_party/harfbuzz-ng/libharfbuzz-ng.a > obj/chrome/app/policy/libcloud_policy_proto_generated_compile.a > obj/base/allocator/liballocator_extension_thunks.a > obj/remoting/libremoting_jingle_glue.a > obj/native_client/src/trusted/service_runtime/libnacl_error_code.a > obj/third_party/snappy/libsnappy.a obj/cc/libcc.a > obj/third_party/libjingle/libjingle_p2p_constants.a > obj/third_party/cld/libcld.a obj/third_party/libxml/libxml2.a > obj/webkit/support/libplugins.a obj/chrome/libvariations_seed_proto.a > obj/remoting/proto/libchromotocol_proto_lib.a > obj/native_client/src/trusted/simple_service/libsimple_service.a > obj/chrome/libsync_file_system_proto.a obj/gpu/libdisk_cache_proto.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_html.a > obj/native_client/src/trusted/interval_multiset/libnacl_interval.a > obj/build/linux/libspeechd.a obj/sync/libsync_internal_api.a > obj/third_party/hunspell/libhunspell.a obj/chrome/libplugin.a > obj/ui/compositor/libcompositor.a obj/base/libbase_prefs.a > obj/ui/web_dialogs/libweb_dialogs.a > obj/native_client/src/trusted/desc/libdesc_wrapper.a > obj/third_party/angle/src/libpreprocessor.a obj/gpu/libgpu_ipc.a > obj/device/libdevice_usb.a obj/sandbox/libsuid_sandbox_client.a > obj/tools/json_schema_compiler/libapi_gen_util.a > obj/third_party/cacheinvalidation/libcacheinvalidation.a > obj/webkit/support/libwebkit_base.a obj/remoting/libremoting_base.a > obj/gpu/libcommand_buffer_client.a obj/gpu/libcommand_buffer_common.a > obj/native_client/src/trusted/service_runtime/arch/x86_64/libservice_runtime_x86_64.a > obj/third_party/libwebp/libwebp_enc.a > obj/native_client/src/trusted/validator_ragel/libdfa_validate_x86_64.a > obj/native_client/src/trusted/desc/libnrd_xfer.a > obj/chrome/libcert_logger_proto.a obj/ppapi/libppapi_ipc.a obj/sdch/libsdch.a > obj/third_party/angle/src/libtranslator_glsl.a obj/ppapi/libppapi_shared.a > obj/gpu/libgles2_implementation.a obj/third_party/libXNVCtrl/libXNVCtrl.a > obj/content/browser/speech/proto/libspeech_proto.a > obj/build/temp_gyp/libgoogleurl.a obj/webkit/support/libuser_agent.a > obj/net/libnet.a obj/media/libmedia_asm.a obj/base/libxdg_mime.a > obj/chrome/libcloud_policy_proto.a obj/content/libcontent_browser.a > obj/native_client/src/trusted/validator/libvalidation_cache.a > obj/chrome/libbrowser_ui.a obj/chrome/libcommon_constants.a > obj/base/third_party/dynamic_annotations/libdynamic_annotations.a > obj/third_party/sfntly/libsfntly.a obj/ppapi/libppapi_cpp_objects.a > obj/third_party/zlib/libzip.a obj/crypto/libcrcrypto.a > obj/webkit/renderer/compositor_bindings/libwebkit_compositor_bindings.a > obj/media/libshared_memory_support.a obj/third_party/undoview/libundoview.a > obj/native_client/src/shared/gio/libgio.a obj/third_party/qcms/libqcms.a > obj/chrome/browser/search_engines/libprepopulated_engines.a > obj/components/libvisitedlink_renderer.a obj/ui/libshell_dialogs.a > obj/sandbox/libsandbox_services.a obj/third_party/libwebp/libwebp_demux.a > obj/third_party/sqlite/libsqlite3.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_svg.a > obj/native_client/src/trusted/cpu_features/libcpu_features.a > obj/chrome/libutility.a obj/chrome/libbrowser_ui_views.a > obj/device/libdevice_bluetooth.a obj/components/libauto_login_parser.a > obj/third_party/libjpeg_turbo/libjpeg_turbo.a > obj/third_party/modp_b64/libmodp_b64.a > obj/third_party/cacheinvalidation/libcacheinvalidation_proto_cpp.a > obj/webkit/support/libwebkit_storage.a > obj/chrome/libin_memory_url_index_cache_proto.a > obj/v8/tools/gyp/libv8_base.x64.a > obj/native_client/src/trusted/validator/x86/ncval_reg_sfi/libncval_reg_sfi_x86_64.a > obj/sync/libsync_api.a obj/native_client/src/shared/srpc/libnonnacl_srpc.a > obj/build/linux/libgio.a obj/third_party/flac/libflac.a > obj/third_party/speex/libspeex.a obj/media/libmedia_sse2.a > obj/third_party/re2/libre2.a obj/net/third_party/nss/libcrssl.a > obj/jingle/libjingle_glue.a obj/components/libautofill_browser.a > obj/native_client/src/shared/platform/libplatform.a libyuv.a > obj/chrome/common/extensions/api/libapi.a obj/content/libcontent_common.a > obj/base/libbase_i18n.a obj/components/libsessions.a obj/base/libbase.a > obj/ppapi/libppapi_proxy.a obj/webkit/support/libwebkit_common.a > obj/webkit/support/libglue_renderer.a obj/jingle/libnotifier.a > obj/third_party/libwebp/libwebp_dec.a obj/components/libautofill_renderer.a > obj/third_party/WebKit/Source/wtf/libwtf.a obj/sync/libsync_proto.a > obj/remoting/libremoting_protocol.a obj/gpu/libgles2_c_lib.a > obj/chrome/libcommon_net.a obj/gpu/libgpu_config.a > obj/native_client/src/trusted/fault_injection/libnacl_fault_inject.a > obj/net/libhttp_server.a obj/chrome/libcommon.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_rendering.a > obj/dbus/libdbus.a obj/remoting/libremoting_client_plugin.a > obj/content/libcontent_app.a > obj/native_client/src/trusted/perf_counter/libnacl_perf_counter.a > obj/printing/libprinting.a obj/content/libcontent_renderer.a > obj/breakpad/libbreakpad_client.a obj/device/libmtp_file_entry_proto.a > obj/native_client/src/trusted/debug_stub/libdebug_stub.a > obj/third_party/hyphen/libhyphen.a obj/third_party/iccjpeg/libiccjpeg.a > obj/third_party/icu/libicui18n.a > obj/third_party/webrtc/modules/libdesktop_capture.a > obj/native_client/src/trusted/validator/x86/decoder/libnc_opcode_modeling_x86_64.a > obj/media/libshared_memory_support_sse.a > obj/components/libvisitedlink_browser.a obj/content/libcontent_plugin.a > obj/third_party/v8-i18n/build/libv8-i18n.a obj/skia/libskia.a > obj/webkit/common/gpu/libwebkit_gpu.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_derived.a > obj/chrome/libsafe_browsing_proto.a obj/net/libnet_with_v8.a obj/sql/libsql.a > obj/components/libautofill_common.a obj/content/libcontent_ppapi_plugin.a > obj/third_party/webrtc/system_wrappers/source/libsystem_wrappers.a > obj/native_client/src/trusted/validator/x86/decoder/libnc_decoder_x86_64.a > obj/native_client/src/trusted/platform_qualify/libplatform_qual_lib.a > obj/gpu/command_buffer/libgles2_utils.a > obj/native_client/src/trusted/gio/libgio_wrapped_desc.a obj/ui/libui.a > obj/components/libencryptor.a > obj/native_client/src/trusted/manifest_name_service_proxy/libmanifest_proxy.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_dom.a > obj/device/libmtp_storage_info_proto.a > obj/chrome/libsafe_browsing_report_proto.a > obj/components/libautofill_risk_proto.a obj/third_party/ffmpeg/libffmpeg.a > obj/components/libnavigation_interception.a obj/gpu/libcommand_buffer_service.a > obj/chrome/libmetrics_proto.a > obj/third_party/WebKit/Source/weborigin/libweborigin.a > obj/third_party/WebKit/Source/modules/libmodules.a obj/media/libmedia.a > obj/third_party/zlib/libchrome_zlib.a > obj/third_party/WebKit/Source/core/core.gyp/libwebcore_remaining.a > obj/native_client/src/trusted/service_runtime/libsel.a > obj/components/libtracing.a obj/components/libvisitedlink_common.a > -Wl,--end-group -lX11 -lXcursor -lXrandr -lXrender -lXss -lXext -lrt -ldl > -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lglib-2.0 -lXtst -lgtk-x11-2.0 > -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 > -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lXi -lsmime3 > -lnssutil3 -lnss3 -lplds4 -lplc4 -lnspr4 -lgconf-2 -lresolv -lXcomposite > -lasound -lXdamage -lXfixes -lcups -lgnutls -lgcrypt -lgpg-error -lz -lpthread > -lcrypt -lm -L/usr/lib64 -lexpat -ldbus-1 -ludev > > -- > You are receiving this mail because: > You are on the CC list for the bug. I'll try to link it without -flto, but I used -fno-fat-lto-objects. It will take me some time to recompile chromium. Weird is that ld.bfd is able to link the binary with -flto (aside gcc related errors). Also happens during clang lto build of chromium. In my case, I just had to increase the limits. Gold has 18718 files open during the final Chromium link: % lsof -c ld |wc -l 18718 Waiting for a tarball for repro. There's my out/Release build folder: https://drive.google.com/file/d/0B0pisUJ80pO1UzFGNGJhaW1xbVE/edit?usp=sharing It's ~3.4GB tar with bzip2 (~6GB extracted). ld --version: GNU gold (GNU Binutils 2.24.51.20140304) 1.11 liblto plugin and command line argument for ld are attached in the tar I will upload. Created attachment 7476 [details]
ld args and liblto plugin
This is related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64837 Since https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64837 has been fixed, now it becomes a dup. *** This bug has been marked as a duplicate of bug 17896 *** Not a duplicate. PR 17896 is not a bug, and the leakage of file descriptors is unrelated to the use of the release_input_file plugin API. Thanks to Peter Collingbourne, I'm now fairly certain that this bug is due to the failure to unlock an external member of a thin archive after claiming it via the plugin interface. I have a patch ready. The master branch has been updated by Cary Coutant <ccoutant@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2cfbf2fece582c29df348104b28677c38a8301f4 commit 2cfbf2fece582c29df348104b28677c38a8301f4 Author: Cary Coutant <ccoutant@google.com> Date: Tue Feb 3 19:54:57 2015 -0800 Fix a file descriptor leak in gold. When an LTO linker plugin claims an external member of a thin archive, gold does not properly unlock the file and make its file descriptor available for reuse. This patch fixes the problem by modifying Archive::include_member to unlock the object file via an RAII class instance, ensuring that it will be unlocked no matter what path is taken through the function. gold/ PR gold/15660 * archive.cc (Thin_archive_object_unlocker): New class. (Archive::include_member): Unlock external members of thin archives. * testsuite/Makefile.am (plugin_test_1): Rename .syms files. (plugin_test_2): Likewise. (plugin_test_3): Likewise. (plugin_test_4): Likewise. (plugin_test_5): Likewise. (plugin_test_6): Likewise. (plugin_test_7): Likewise. (plugin_test_8): Likewise. (plugin_test_9): Likewise. (plugin_test_10): Likewise. (plugin_test_11): New test case. * testsuite/Makefile.in: Regenerate. * testsuite/plugin_test.c (claim_file_hook): Check for parallel .syms file to decide whether to claim file. (all_symbols_read_hook): Likewise. * testsuite/plugin_test_1.sh: Adjust expected output. * testsuite/plugin_test_2.sh: Likewise. * testsuite/plugin_test_3.sh: Likewise. * testsuite/plugin_test_6.sh: Likewise. * testsuite/plugin_test_tls.sh: Likewise. * testsuite/plugin_test_11.sh: New testcase. Fixed. Thank you. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64837#c19 |