Skip to content

file not found on Ubuntu #1

Closed
Closed
@thejoshwolfe

Description

@thejoshwolfe
josh@jash:~/dev/zig$ mkdir build
josh@jash:~/dev/zig$ cd build
josh@jash:~/dev/zig/build$ cmake ..
-- The CXX compiler identification is GNU 5.2.1
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Configuring zig version 0.0.0
-- Found LLVM: -lLLVMLTO -lLLVMObjCARCOpts -lLLVMLinker -lLLVMBitWriter -lLLVMIRReader -lLLVMBPFCodeGen -lLLVMBPFDesc -lLLVMBPFInfo -lLLVMBPFAsmPrinter -lLLVMAMDGPUCodeGen -lLLVMAMDGPUAsmParser -lLLVMAMDGPUUtils -lLLVMAMDGPUDesc -lLLVMAMDGPUInfo -lLLVMAMDGPUAsmPrinter -lLLVMSystemZDisassembler -lLLVMSystemZCodeGen -lLLVMSystemZAsmParser -lLLVMSystemZDesc -lLLVMSystemZInfo -lLLVMSystemZAsmPrinter -lLLVMHexagonDisassembler -lLLVMHexagonCodeGen -lLLVMHexagonDesc -lLLVMHexagonInfo -lLLVMNVPTXCodeGen -lLLVMNVPTXDesc -lLLVMNVPTXInfo -lLLVMNVPTXAsmPrinter -lLLVMCppBackendCodeGen -lLLVMCppBackendInfo -lLLVMMSP430CodeGen -lLLVMMSP430Desc -lLLVMMSP430Info -lLLVMMSP430AsmPrinter -lLLVMXCoreDisassembler -lLLVMXCoreCodeGen -lLLVMXCoreDesc -lLLVMXCoreInfo -lLLVMXCoreAsmPrinter -lLLVMMipsDisassembler -lLLVMMipsCodeGen -lLLVMMipsAsmParser -lLLVMMipsDesc -lLLVMMipsInfo -lLLVMMipsAsmPrinter -lLLVMAArch64Disassembler -lLLVMAArch64CodeGen -lLLVMAArch64AsmParser -lLLVMAArch64Desc -lLLVMAArch64Info -lLLVMAArch64AsmPrinter -lLLVMAArch64Utils -lLLVMARMDisassembler -lLLVMARMCodeGen -lLLVMARMAsmParser -lLLVMARMDesc -lLLVMARMInfo -lLLVMARMAsmPrinter -lLLVMPowerPCDisassembler -lLLVMPowerPCCodeGen -lLLVMPowerPCAsmParser -lLLVMPowerPCDesc -lLLVMPowerPCInfo -lLLVMPowerPCAsmPrinter -lLLVMSparcDisassembler -lLLVMSparcCodeGen -lLLVMSparcAsmParser -lLLVMSparcDesc -lLLVMSparcInfo -lLLVMSparcAsmPrinter -lLLVMMIRParser -lLLVMAsmParser -lLLVMLibDriver -lLLVMOption -lLLVMDebugInfoPDB -lLLVMTableGen -lLLVMOrcJIT -lLLVMLineEditor -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMDebugInfoDWARF -lLLVMPasses -lLLVMipo -lLLVMVectorize -lLLVMInterpreter -lLLVMExecutionEngine -lLLVMRuntimeDyld -lLLVMCodeGen -lLLVMTarget -lLLVMScalarOpts -lLLVMProfileData -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMInstCombine -lLLVMInstrumentation -lLLVMTransformUtils -lLLVMipa -lLLVMMC -lLLVMAnalysis -lLLVMCore -lLLVMSupport;-lz -lpthread -lffi -ledit -ltinfo -ldl -lm  
-- Configuring done
-- Generating done
-- Build files have been written to: /home/josh/dev/zig/build
josh@jash:~/dev/zig/build$ make
Scanning dependencies of target run_tests
[  7%] Building CXX object CMakeFiles/run_tests.dir/src/buffer.cpp.o
[ 15%] Building CXX object CMakeFiles/run_tests.dir/src/util.cpp.o
[ 23%] Building CXX object CMakeFiles/run_tests.dir/src/os.cpp.o
[ 30%] Building CXX object CMakeFiles/run_tests.dir/test/standalone.cpp.o
Linking CXX executable run_tests
[ 30%] Built target run_tests
Scanning dependencies of target zig
[ 38%] Building CXX object CMakeFiles/zig.dir/src/buffer.cpp.o
[ 46%] Building CXX object CMakeFiles/zig.dir/src/error.cpp.o
[ 53%] Building CXX object CMakeFiles/zig.dir/src/main.cpp.o
[ 61%] Building CXX object CMakeFiles/zig.dir/src/parser.cpp.o
[ 69%] Building CXX object CMakeFiles/zig.dir/src/tokenizer.cpp.o
[ 76%] Building CXX object CMakeFiles/zig.dir/src/util.cpp.o
[ 84%] Building CXX object CMakeFiles/zig.dir/src/codegen.cpp.o
[ 92%] Building CXX object CMakeFiles/zig.dir/src/zig_llvm.cpp.o
[100%] Building CXX object CMakeFiles/zig.dir/src/os.cpp.o
Linking CXX executable zig
[100%] Built target zig
josh@jash:~/dev/zig/build$ ./zig build --output hello ../test/hello.zig 
Original source:
----------------
#link("c")
extern {
    fn puts(s: *mut u8) -> i32;
    fn exit(code: i32) -> unreachable;
}

fn _start() -> unreachable {
    puts("Hello, world!");
    exit(0);
}


Tokens:
---------
NumberSign #
Symbol link
LParen (
StringLiteral "c"
RParen )
Extern extern
LBrace {
Fn fn
Symbol puts
LParen (
Symbol s
Colon :
Star *
Mut mut
Symbol u8
RParen )
Arrow ->
Symbol i32
Semicolon ;
Fn fn
Symbol exit
LParen (
Symbol code
Colon :
Symbol i32
RParen )
Arrow ->
Unreachable unreachable
Semicolon ;
RBrace }
Fn fn
Symbol _start
LParen (
RParen )
Arrow ->
Unreachable unreachable
LBrace {
Symbol puts
LParen (
StringLiteral "Hello, world!"
RParen )
Semicolon ;
Symbol exit
LParen (
NumberLiteral 0
RParen )
Semicolon ;
RBrace }
EOF 

AST:
------
Root
  ExternBlock
    FnDecl
      FnProto 'puts'
        ParamDecl 's'
          'mut' PointerType
            Type 'u8'
        Type 'i32'
    FnDecl
      FnProto 'exit'
        ParamDecl 'code'
          Type 'i32'
        Type 'unreachable'
  FnDef
    FnProto '_start'
      Type 'unreachable'
    Block
      FnCallExpression
        FnCall 'puts'
          StringLiteralExpression 'Hello, world!'
      FnCallExpression
        FnCall 'exit'
          NumberLiteralExpression 0

Semantic Analysis:
--------------------
OK

Code Generation:
------------------
; ModuleID = 'ZigModule'

@0 = private unnamed_addr constant [14 x i8] c"Hello, world!\00"

; Function Attrs: noreturn
declare void @exit(i32) #0

declare i32 @puts(i8*)

; Function Attrs: noreturn nounwind
define void @_start() #1 {
entry:
  %0 = call i32 @puts(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @0, i32 0, i32 0)), !dbg !8
  call void @exit(i32 0), !dbg !10
  unreachable, !dbg !10
}

attributes #0 = { noreturn }
attributes #1 = { noreturn nounwind }

!llvm.dbg.cu = !{!0}

!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "zig 0.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3)
!1 = !DIFile(filename: "hello.zig", directory: "../test")
!2 = !{}
!3 = !{!4}
!4 = !DISubprogram(name: "_start", scope: !1, file: !1, line: 7, type: !5, isLocal: false, isDefinition: true, scopeLine: 7, isOptimized: false, function: void ()* @_start, variables: !2)
!5 = !DISubroutineType(types: !6)
!6 = !{!7}
!7 = !DIBasicType(name: "void", encoding: DW_ATE_unsigned)
!8 = !DILocation(line: 8, column: 5, scope: !9)
!9 = distinct !DILexicalBlock(scope: !4, file: !1, line: 7, column: 28)
!10 = !DILocation(line: 9, column: 5, scope: !9)

Link:
-------
OK
josh@jash:~/dev/zig/build$ ./hello 
bash: ./hello: No such file or directory

The problem is that ./hello is linked against /lib/ld64.so.1 instead of /lib64/ld-linux-x86-64.so.2. This seems to be due to ld being misconfigured on Debian.

This patch can work around the issue:

diff --git a/src/codegen.cpp b/src/codegen.cpp
index d59eff3..8318a43 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -721,6 +721,8 @@ void code_gen_link(CodeGen *g, const char *out_file) {
     if (g->is_static) {
         args.append("-static");
     }
+    args.append("-dynamic-linker");
+    args.append("/lib64/ld-linux-x86-64.so.2");
     args.append("-o");
     args.append(out_file);
     args.append((const char *)buf_ptr(&out_file_o));

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions