intermezzOS / kernel

A hobby operating system, in Rust
http://intermezzos.github.io/
Apache License 2.0
1.39k stars 90 forks source link

linker-flavor required #111

Closed ghost closed 7 years ago

ghost commented 7 years ago

I noticed that intermezzOS doesn't compile anymore due to this commit that makes xargo require the "linker-flavor" argument in the x86_64-unknown-intermezzos-gnu.json file.

Once added the line "linker-flavor": "ld", it started compiling, but I was still getting errors, that led me to add another line "linker": "ld",.

Now it compiles just fine, but when I try to make run grub returns this error:

error: no multiboot header found
error: you need to load the kernel first

Can anyone help me? :)

steveklabnik commented 7 years ago

We recently got a pr for https://github.com/intermezzOS/book/pull/166, maybe give what it changed there a try? I had been meaning to do this but have not yet had the time, and am likely not for a few weeks :(

steveej commented 7 years ago

I have tested a couple of combinations, none leading to success so far.

My environment:

$ rustc --version
rustc 1.19.0-nightly (75b056812 2017-05-15)
$ ld --version
GNU ld (GNU Binutils) 2.28
$ gcc --version
gcc (GCC) 5.4.0
$ clang --version
clang version 3.9.1 (tags/RELEASE_391/final)

"linker-flavor": "gcc"

     Running `rustc --crate-name intermezzos src/main.rs --crate-type bin --emit=dep-info,link -C opt-level=3 -C panic=abort -C metadata=e6e9de07dfdfab24 -C extra-filename=-e6e9de07dfdfab24 --out-dir /home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps --target x86_64-unknown-intermezzos-gnu -L dependency=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps -L dependency=/home/steveej/src/intermezzOS/kernel/target/release/deps --extern interrupts=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib --extern pic=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib --extern x86=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib --extern console=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib --extern spin=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib --extern rlibc=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib --extern lazy_static=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib --extern keyboard=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib --extern intermezzos=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib --sysroot /home/steveej/.xargo -L native=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out`
error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-L" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/intermezzos-e6e9de07dfdfab24.0.o" "-o" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/intermezzos-e6e9de07dfdfab24" "-Wl,--gc-sections" "-nodefaultlibs" "-L" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps" "-L" "/home/steveej/src/intermezzOS/kernel/target/release/deps" "-L" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out" "-L" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib" "-Wl,-Bstatic" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libphf-bd5f2ae3a9a7fc25.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libphf_shared-0eee2d15ac68a4a9.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libraw_cpuid-610484b9caf0ef6f.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libbitflags-bf6302842d1560e0.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib/libcore-87cbd04ab1bd4da8.rlib" "-Wl,-Bdynamic"
  = note: /nix/store/izxnyg94352qxa4a4783dzgnpy5cwazj-glibc-2.25/lib/crt1.o: In function `_start':
          /tmp/nix-build-glibc-2.25.drv-0/glibc-2.25/csu/../sysdeps/x86_64/start.S:107: undefined reference to `__libc_csu_fini'
          /tmp/nix-build-glibc-2.25.drv-0/glibc-2.25/csu/../sysdeps/x86_64/start.S:108: undefined reference to `__libc_csu_init'
          /tmp/nix-build-glibc-2.25.drv-0/glibc-2.25/csu/../sysdeps/x86_64/start.S:110: undefined reference to `main'
          /tmp/nix-build-glibc-2.25.drv-0/glibc-2.25/csu/../sysdeps/x86_64/start.S:120: undefined reference to `__libc_start_main'
          clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)

"linker-flavor": "ld"

     Running `rustc --crate-name intermezzos src/main.rs --crate-type bin --emit=dep-info,link -C opt-level=3 -C panic=abort -C metadata=e6e9de07dfdfab24 -C extra-filename=-e6e9de07dfdfab24 --out-dir /home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps --target x86_64-unknown-intermezzos-gnu -L dependency=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps -L dependency=/home/steveej/src/intermezzOS/kernel/target/release/deps --extern lazy_static=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib --extern rlibc=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib --extern spin=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib --extern pic=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib --extern console=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib --extern interrupts=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib --extern keyboard=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib --extern x86=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib --extern intermezzos=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib --sysroot /home/steveej/.xargo -L native=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out`
error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-L" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/intermezzos-e6e9de07dfdfab24.0.o" "-o" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/intermezzos-e6e9de07dfdfab24" "--gc-sections" "-L" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps" "-L" "/home/steveej/src/intermezzOS/kernel/target/release/deps" "-L" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out" "-L" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib" "-Bstatic" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libphf-bd5f2ae3a9a7fc25.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libphf_shared-0eee2d15ac68a4a9.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libraw_cpuid-610484b9caf0ef6f.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libbitflags-bf6302842d1560e0.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib/libcore-87cbd04ab1bd4da8.rlib" "-Bdynamic"
  = note: clang-3.9: error: unsupported option '--gc-sections'

"linker": "ld", "linker-flavor": "ld"

Compilation works:

     Running `rustc --crate-name intermezzos src/main.rs --crate-type bin --emit=dep-info,link -C opt-level=3 -C panic=abort -C metadata=e6e9de07dfdfab24 -C extra-filename=-e6e9de07dfdfab24 --out-dir /home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps --target x86_64-unknown-intermezzos-gnu -L dependency=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps -L dependency=/home/steveej/src/intermezzOS/kernel/target/release/deps --extern lazy_static=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib --extern x86=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib --extern console=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib --extern pic=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib --extern keyboard=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib --extern rlibc=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib --extern spin=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib --extern interrupts=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib --extern intermezzos=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib --sysroot /home/steveej/.xargo -L native=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out`
    Finished release [optimized] target(s) in 0.66 secs

The VM starts and displays the following error:

error: no multiboot header found
error: you need to load the kernel first

readelf --all target/isofiles/boot/intermezzos

"linker": "ld", "linker-flavor": "gcc"

     Running `rustc --crate-name intermezzos src/main.rs --crate-type bin --emit=dep-info,link -C opt-level=3 -C panic=abort -C metadata=e6e9de07dfdfab24 -C extra-filename=-e6e9de07dfdfab24 --out-dir /home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps --target x86_64-unknown-intermezzos-gnu -L dependency=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps -L dependency=/home/steveej/src/intermezzOS/kernel/target/release/deps --extern console=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib --extern spin=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib --extern keyboard=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib --extern lazy_static=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib --extern interrupts=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib --extern rlibc=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib --extern x86=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib --extern pic=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib --extern intermezzos=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib --sysroot /home/steveej/.xargo -L native=/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out`
error: linking with `ld` failed: exit code: 1
  |
  = note: "ld" "-L" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/intermezzos-e6e9de07dfdfab24.0.o" "-o" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/intermezzos-e6e9de07dfdfab24" "-Wl,--gc-sections" "-nodefaultlibs" "-L" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps" "-L" "/home/steveej/src/intermezzOS/kernel/target/release/deps" "-L" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/build/intermezzos-77c8134ab23350d9/out" "-L" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib" "-Wl,-Bstatic" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/librlibc-3b5dd58fe6112865.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libkeyboard-e649fc67bae3e832.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/liblazy_static-a1d42ece48b6e66f.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libintermezzos-764caafc5c20e8d7.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libinterrupts-c6c7ed04139a38d8.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libspin-00fabb98c7f7241e.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libpic-f51a110abc9e6c47.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libx86-ce431f3e38a680c9.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libphf-bd5f2ae3a9a7fc25.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libphf_shared-0eee2d15ac68a4a9.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libraw_cpuid-610484b9caf0ef6f.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libbitflags-bf6302842d1560e0.rlib" "/home/steveej/src/intermezzOS/kernel/target/x86_64-unknown-intermezzos-gnu/release/deps/libconsole-fc559238ff9a559b.rlib" "/home/steveej/.xargo/lib/rustlib/x86_64-unknown-intermezzos-gnu/lib/libcore-87cbd04ab1bd4da8.rlib" "-Wl,-Bdynamic"
  = note: /nix/store/8yb0smqwyf3da339b5kjhw8vwlslrdp0-binutils-2.28/bin/ld: unrecognized option '-Wl,--gc-sections'
          /nix/store/8yb0smqwyf3da339b5kjhw8vwlslrdp0-binutils-2.28/bin/ld: use the --help option for usage information

I don't know what else to try now ;-)

steveklabnik commented 7 years ago

@phil-opp have you run into this stuff?

steveej commented 7 years ago

For me the issue is not fixed after #112. It seems that the sections, namely .boot and .text don't make it into the binary:

$ objdump -h target/isofiles/boot/intermezzos 

target/isofiles/boot/intermezzos:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .eh_frame_hdr 0000000c  0000000000400120  0000000000400120  00000120  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .eh_frame     00000000  0000000000400130  0000000000400130  00000130  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
hawkw commented 7 years ago

@steveeJ Whoops! My kernel is linked correctly after using the new target.json syntax, so I foolishly assumed that intermezzOS would be as well. I'm passing slightly different flags, though...