Skip to content

Instantly share code, notes, and snippets.

@cr1901
Last active January 8, 2017 06:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cr1901/34880b393fff05171cb1cafec49a5228 to your computer and use it in GitHub Desktop.
Save cr1901/34880b393fff05171cb1cafec49a5228 to your computer and use it in GitHub Desktop.
Binutils Long Link Times Replication Procedure

LLVM config (some irrelevant options are missing).

CC=gcc CXX=g++ cmake $LLVM_DIR -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DLLVM_TARGETS_TO_BUILD="X86" -DCMAKE_INSTALL_PREFIX=$PREFIX

Binutils config

Built using the MINGW-packages repo: https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-binutils, with additional CFLAGS options to enable profiling (CFLAGS=-pg), --with-libiconv=/mingw64, --with-sysroot=/mingw64, and --prefix=/opt/bindebug

  • The linker without these patches, and the only configure option being --prefix=/opt/bindebug is nonfunctional, bombing with obscure errors such as:
$ gcc -Wl,-v -B /opt/bindebug/bin/ add.c
collect2 version 5.3.0
C:/msys64/opt/bindebug/bin/ld.exe -plugin C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/liblto_plugin-0.dll -plugin-opt=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\msys64\tmp\ccI21h9j.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -m i386pep -Bdynamic C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/crtbegin.o -LC:/msys64/opt/bindebug/bin -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0 -LC:/msys64/mingw64/bin/../lib/gcc -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../.. -v C:\msys64\tmp\ccY3IKUb.o -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib/default-manifest.o C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/crtend.o
GNU ld (GNU Binutils) 2.27C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o: error adding symbols: File truncated
collect2.exe: error: ld returned 1 exit status
$ gcc -nostdlib -Wl,-v -B /opt/bindebug/bin/ add.c
collect2 version 5.3.0
C:/msys64/opt/bindebug/bin/ld.exe -plugin C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/liblto_plugin-0.dll -plugin-opt=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\msys64\tmp\ccPhx7F0.res -m i386pep -Bdynamic -LC:/msys64/opt/bindebug/bin -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0 -LC:/msys64/mingw64/bin/../lib/gcc -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../.. -v C:\msys64\tmp\ccGFmL2k.o
GNU ld (GNU Binutils) 2.27C:/msys64/opt/bindebug/bin/ld.exe: C:\msys64\tmp\ccGFmL2k.o (text): Section flag IMAGE_SCN_MEM_NOT_CACHED (0x4000000) ignored
C:/msys64/opt/bindebug/bin/ld.exe: C:\msys64\tmp\ccGFmL2k.o: Warning: Ignoring section flag IMAGE_SCN_MEM_NOT_PAGED in section text
C:/msys64/opt/bindebug/bin/ld.exe: error: C:\msys64\tmp\ccGFmL2k.o: file too short
collect2.exe: error: ld returned 1 exit status

Build command for generating gmon.out

ninja -v
g++ -B/opt/bindebug/bin -v -Wl,-v -Wa,-mbig-obj -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment -Werror=date-time -std=gnu++11 -g  F:/build-llvm-or1k/tools/lto/LTO.def -shared -o bin\LTO.dll -Wl,--out-implib,lib\libLTO.dll.a -Wl,--major-image-version,0,--minor-image-version,0 tools/lto/CMakeFiles/LTO.dir/LTODisassembler.cpp.obj tools/lto/CMakeFiles/LTO.dir/lto.cpp.obj  lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMX86Disassembler.a lib/libLLVMOR1KCodeGen.a lib/libLLVMOR1KAsmPrinter.a lib/libLLVMOR1KAsmParser.a lib/libLLVMOR1KDesc.a lib/libLLVMOR1KInfo.a lib/libLLVMOR1KDisassembler.a lib/libLLVMBitReader.a lib/libLLVMCore.a lib/libLLVMLTO.a lib/libLLVMMC.a lib/libLLVMMCDisassembler.a lib/libLLVMSupport.a lib/libLLVMTarget.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86Utils.a lib/libLLVMX86Info.a lib/libLLVMAsmPrinter.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMSelectionDAG.a lib/libLLVMOR1KAsmPrinter.a lib/libLLVMOR1KInfo.a lib/libLLVMCodeGen.a lib/libLLVMTarget.a lib/libLLVMBitWriter.a lib/libLLVMObjCARCOpts.a lib/libLLVMipo.a lib/libLLVMObject.a lib/libLLVMMCParser.a lib/libLLVMLinker.a lib/libLLVMScalarOpts.a lib/libLLVMInstCombine.a lib/libLLVMInstrumentation.a lib/libLLVMMC.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMVectorize.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMProfileData.a lib/libLLVMCore.a lib/libLLVMSupport.a -lpsapi -lshell32 -lole32 -luuid -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
gprof /opt/bindebug/bin/ld.bfd.exe gmon.out > gprof.log
  • Ninja should be run with the normal linker until bin/LTO.dll is linked, at which point I took the g++ command line and prepended -B/opt/bindebug/bin -v -Wl,-v. The command line input to collect2 and ld itself is:
 C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/collect2.exe -plugin C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/liblto_plugin-0.dll -plugin-opt=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\msys64\tmp\ccZVDYdr.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -m i386pep --shared -Bdynamic -e DllMainCRTStartup --enable-auto-image-base -o binLTO.dll C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/crtbegin.o -LC:/msys64/opt/bindebug/bin -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0 -LC:/msys64/mingw64/bin/../lib/gcc -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../.. -v F:/build-llvm-or1k/tools/lto/LTO.def --out-implib liblibLTO.dll.a --major-image-version 0 --minor-image-version 0 tools/lto/CMakeFiles/LTO.dir/LTODisassembler.cpp.obj tools/lto/CMakeFiles/LTO.dir/lto.cpp.obj lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMX86Disassembler.a lib/libLLVMOR1KCodeGen.a lib/libLLVMOR1KAsmPrinter.a lib/libLLVMOR1KAsmParser.a lib/libLLVMOR1KDesc.a lib/libLLVMOR1KInfo.a lib/libLLVMOR1KDisassembler.a lib/libLLVMBitReader.a lib/libLLVMCore.a lib/libLLVMLTO.a lib/libLLVMMC.a lib/libLLVMMCDisassembler.a lib/libLLVMSupport.a lib/libLLVMTarget.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86Utils.a lib/libLLVMX86Info.a lib/libLLVMAsmPrinter.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMSelectionDAG.a lib/libLLVMOR1KAsmPrinter.a lib/libLLVMOR1KInfo.a lib/libLLVMCodeGen.a lib/libLLVMTarget.a lib/libLLVMBitWriter.a lib/libLLVMObjCARCOpts.a lib/libLLVMipo.a lib/libLLVMObject.a lib/libLLVMMCParser.a lib/libLLVMLinker.a lib/libLLVMScalarOpts.a lib/libLLVMInstCombine.a lib/libLLVMInstrumentation.a lib/libLLVMMC.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMVectorize.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMProfileData.a lib/libLLVMCore.a lib/libLLVMSupport.a -lpsapi -lshell32 -lole32 -luuid -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -lstdc++ -lmingw32 -lgcc_s --undefined=___deregister_frame_info --undefined=___register_frame_info -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s --undefined=___deregister_frame_info --undefined=___register_frame_info -lgcc -lmoldname -lmingwex -lmsvcrt C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/crtend.o
collect2 version 5.3.0
C:/msys64/opt/bindebug/bin/ld.exe -plugin C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/liblto_plugin-0.dll -plugin-opt=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/lto-wrapper.exe -plugin-opt=-fresolution=C:\msys64\tmp\ccZVDYdr.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -m i386pep --shared -Bdynamic -e DllMainCRTStartup --enable-auto-image-base -o binLTO.dll C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/crtbegin.o -LC:/msys64/opt/bindebug/bin -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0 -LC:/msys64/mingw64/bin/../lib/gcc -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib/../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../../../x86_64-w64-mingw32/lib -LC:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/../../.. -v F:/build-llvm-or1k/tools/lto/LTO.def --out-implib liblibLTO.dll.a --major-image-version 0 --minor-image-version 0 tools/lto/CMakeFiles/LTO.dir/LTODisassembler.cpp.obj tools/lto/CMakeFiles/LTO.dir/lto.cpp.obj lib/libLLVMX86CodeGen.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86AsmParser.a lib/libLLVMX86Desc.a lib/libLLVMX86Info.a lib/libLLVMX86Disassembler.a lib/libLLVMOR1KCodeGen.a lib/libLLVMOR1KAsmPrinter.a lib/libLLVMOR1KAsmParser.a lib/libLLVMOR1KDesc.a lib/libLLVMOR1KInfo.a lib/libLLVMOR1KDisassembler.a lib/libLLVMBitReader.a lib/libLLVMCore.a lib/libLLVMLTO.a lib/libLLVMMC.a lib/libLLVMMCDisassembler.a lib/libLLVMSupport.a lib/libLLVMTarget.a lib/libLLVMX86AsmPrinter.a lib/libLLVMX86Utils.a lib/libLLVMX86Info.a lib/libLLVMAsmPrinter.a lib/libLLVMDebugInfoCodeView.a lib/libLLVMSelectionDAG.a lib/libLLVMOR1KAsmPrinter.a lib/libLLVMOR1KInfo.a lib/libLLVMCodeGen.a lib/libLLVMTarget.a lib/libLLVMBitWriter.a lib/libLLVMObjCARCOpts.a lib/libLLVMipo.a lib/libLLVMObject.a lib/libLLVMMCParser.a lib/libLLVMLinker.a lib/libLLVMScalarOpts.a lib/libLLVMInstCombine.a lib/libLLVMInstrumentation.a lib/libLLVMMC.a lib/libLLVMIRReader.a lib/libLLVMBitReader.a lib/libLLVMAsmParser.a lib/libLLVMVectorize.a lib/libLLVMTransformUtils.a lib/libLLVMAnalysis.a lib/libLLVMProfileData.a lib/libLLVMCore.a lib/libLLVMSupport.a -lpsapi -lshell32 -lole32 -luuid -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -lstdc++ -lmingw32 -lgcc_s --undefined=___deregister_frame_info --undefined=___register_frame_info -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s --undefined=___deregister_frame_info --undefined=___register_frame_info -lgcc -lmoldname -lmingwex -lmsvcrt C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/5.3.0/crtend.o
GNU ld (GNU Binutils) 2.27
  • The gprof.log analysis on Bugzilla is the output of the above ld command.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment