Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fails to build on x86 #1468

Open
kpcyrd opened this issue Jan 31, 2024 · 3 comments
Open

Fails to build on x86 #1468

kpcyrd opened this issue Jan 31, 2024 · 3 comments
Assignees
Labels

Comments

@kpcyrd
Copy link
Contributor

kpcyrd commented Jan 31, 2024

Describe the bug

Opening this as a tracking issue, related to #1467 and https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/59413.

To Reproduce

Simply build for 32bit x86:

error[E0308]: mismatched types
   --> src/event_log.rs:126:43
    |
126 | ...                   event.child = get_event_data(*pid).ok();
    |                       -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<i64>`, found `Option<i32>`
    |                       |
    |                       expected due to the type of this binding
    |
    = note: expected enum `std::option::Option<i64>`
               found enum `std::option::Option<i32>`
error[E0308]: mismatched types
   --> src/event_log.rs:132:43
    |
132 | ...                   event.child = get_event_data(*pid).ok();
    |                       -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<i64>`, found `Option<i32>`
    |                       |
    |                       expected due to the type of this binding
    |
    = note: expected enum `std::option::Option<i64>`
               found enum `std::option::Option<i32>`
error[E0308]: mismatched types
   --> src/event_log.rs:138:43
    |
138 | ...                   event.child = get_event_data(*pid).ok();
    |                       -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<i64>`, found `Option<i32>`
    |                       |
    |                       expected due to the type of this binding
    |
    = note: expected enum `std::option::Option<i64>`
               found enum `std::option::Option<i32>`
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:59:34
   |
59 |         let mut intdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 & i64`
  --> src/process_handling/breakpoint.rs:59:32
   |
59 |         let mut intdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                ^ no implementation for `i32 & i64`
   |
   = help: the trait `std::ops::BitAnd<i64>` is not implemented for `i32`
   = help: the following other types implement trait `std::ops::BitAnd<Rhs>`:
             <i32 as std::ops::BitAnd>
             <i32 as std::ops::BitAnd<&i32>>
             <&'a i32 as std::ops::BitAnd<i32>>
             <&i32 as std::ops::BitAnd<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:60:20
   |
60 |         intdata |= (INT << self.shift) as i64;
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 |= i64`
  --> src/process_handling/breakpoint.rs:60:17
   |
60 |         intdata |= (INT << self.shift) as i64;
   |                 ^^ no implementation for `i32 |= i64`
   |
   = help: the trait `BitOrAssign<i64>` is not implemented for `i32`
   = help: the following other types implement trait `BitOrAssign<Rhs>`:
             <i32 as BitOrAssign>
             <i32 as BitOrAssign<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:64:59
   |
64 |             write_to_address(pid, self.aligned_address(), intdata)
   |             ----------------                              ^^^^^^^ expected `i64`, found `i32`
   |             |
   |             arguments to this function are incorrect
   |
note: function defined here
  --> src/process_handling/ptrace_control.rs:42:8
   |
42 | pub fn write_to_address(pid: Pid, address: u64, data: i64) -> Result<()> {
   |        ^^^^^^^^^^^^^^^^                         ---------
help: you can convert an `i32` to an `i64`
   |
64 |             write_to_address(pid, self.aligned_address(), intdata.into())
   |                                                                  +++++++
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:71:34
   |
71 |         let mut orgdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 & i64`
  --> src/process_handling/breakpoint.rs:71:32
   |
71 |         let mut orgdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                ^ no implementation for `i32 & i64`
   |
   = help: the trait `std::ops::BitAnd<i64>` is not implemented for `i32`
   = help: the following other types implement trait `std::ops::BitAnd<Rhs>`:
             <i32 as std::ops::BitAnd>
             <i32 as std::ops::BitAnd<&i32>>
             <&'a i32 as std::ops::BitAnd<i32>>
             <&i32 as std::ops::BitAnd<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:72:20
   |
72 |         orgdata |= i64::from(self.data) << self.shift;
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 |= i64`
  --> src/process_handling/breakpoint.rs:72:17
   |
72 |         orgdata |= i64::from(self.data) << self.shift;
   |                 ^^ no implementation for `i32 |= i64`
   |
   = help: the trait `BitOrAssign<i64>` is not implemented for `i32`
   = help: the following other types implement trait `BitOrAssign<Rhs>`:
             <i32 as BitOrAssign>
             <i32 as BitOrAssign<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:73:55
   |
73 |         write_to_address(pid, self.aligned_address(), orgdata)
   |         ----------------                              ^^^^^^^ expected `i64`, found `i32`
   |         |
   |         arguments to this function are incorrect
   |
note: function defined here
  --> src/process_handling/ptrace_control.rs:42:8
   |
42 | pub fn write_to_address(pid: Pid, address: u64, data: i64) -> Result<()> {
   |        ^^^^^^^^^^^^^^^^                         ---------
help: you can convert an `i32` to an `i64`
   |
73 |         write_to_address(pid, self.aligned_address(), orgdata.into())
   |                                                              +++++++
Some errors have detailed explanations: E0277, E0308.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `cargo-tarpaulin` (lib) due to 13 previous errors
warning: build failed, waiting for other jobs to finish...

I didn't get around to fully port this yet, but one required change seems to be:

diff --git a/Cargo.toml b/Cargo.toml
index db80d35..f1d65e2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -56,7 +56,7 @@ walkdir = "2.4.0"
 glob = "0.3.1"
 enum-display = "0.1.3"
 
-[target.'cfg(all(target_os = "linux", target_arch = "x86_64"))'.dependencies]
+[target.'cfg(all(target_os = "linux", any(target_arch = "x86_64", target_arch = "x86")))'.dependencies]
 libc = "0.2.94"
 nix = {version = "0.27.1", default-features = false, features = ["sched", "signal", "ptrace", "personality"]}
 procfs = "0.16"

This wasn't caught earlier because tests for x86 secretly run on x86_64, see #1467.

Expected behavior

Builds on x86.

@xd009642
Copy link
Owner

I merged in that change with #1521 as it seems to be the only one needed (had a brief look at ptrace code to make sure registers etc look correct). I still haven't got CI to behave and needing OpenSSL versions for the target might complicate it further so fixing the CI is still a TODO

@xd009642 xd009642 added the bug label Apr 27, 2024
@kpcyrd
Copy link
Contributor Author

kpcyrd commented Jun 10, 2024

Sorry for not getting back to this sooner, I'm still getting some errors with 0.30.0 on x86 musl:

error[E0308]: mismatched types
   --> src/event_log.rs:126:43
    |
126 | ...                   event.child = get_event_data(*pid).ok();
    |                       -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<i64>`, found `Option<i32>`
    |                       |
    |                       expected due to the type of this binding
    |
    = note: expected enum `std::option::Option<i64>`
               found enum `std::option::Option<i32>`
error[E0308]: mismatched types
   --> src/event_log.rs:132:43
    |
132 | ...                   event.child = get_event_data(*pid).ok();
    |                       -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<i64>`, found `Option<i32>`
    |                       |
    |                       expected due to the type of this binding
    |
    = note: expected enum `std::option::Option<i64>`
               found enum `std::option::Option<i32>`
error[E0308]: mismatched types
   --> src/event_log.rs:138:43
    |
138 | ...                   event.child = get_event_data(*pid).ok();
    |                       -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Option<i64>`, found `Option<i32>`
    |                       |
    |                       expected due to the type of this binding
    |
    = note: expected enum `std::option::Option<i64>`
               found enum `std::option::Option<i32>`
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:59:34
   |
59 |         let mut intdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 & i64`
  --> src/process_handling/breakpoint.rs:59:32
   |
59 |         let mut intdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                ^ no implementation for `i32 & i64`
   |
   = help: the trait `std::ops::BitAnd<i64>` is not implemented for `i32`
   = help: the following other types implement trait `std::ops::BitAnd<Rhs>`:
             <i32 as std::ops::BitAnd>
             <i32 as std::ops::BitAnd<&i32>>
             <&'a i32 as std::ops::BitAnd<i32>>
             <&i32 as std::ops::BitAnd<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:60:20
   |
60 |         intdata |= (INT << self.shift) as i64;
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 |= i64`
  --> src/process_handling/breakpoint.rs:60:17
   |
60 |         intdata |= (INT << self.shift) as i64;
   |                 ^^ no implementation for `i32 |= i64`
   |
   = help: the trait `std::ops::BitOrAssign<i64>` is not implemented for `i32`
   = help: the following other types implement trait `std::ops::BitOrAssign<Rhs>`:
             <i32 as std::ops::BitOrAssign>
             <i32 as std::ops::BitOrAssign<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:64:59
   |
64 |             write_to_address(pid, self.aligned_address(), intdata)
   |             ----------------                              ^^^^^^^ expected `i64`, found `i32`
   |             |
   |             arguments to this function are incorrect
   |
note: function defined here
  --> src/process_handling/ptrace_control.rs:42:8
   |
42 | pub fn write_to_address(pid: Pid, address: u64, data: i64) -> Result<()> {
   |        ^^^^^^^^^^^^^^^^                         ---------
help: you can convert an `i32` to an `i64`
   |
64 |             write_to_address(pid, self.aligned_address(), intdata.into())
   |                                                                  +++++++
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:71:34
   |
71 |         let mut orgdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 & i64`
  --> src/process_handling/breakpoint.rs:71:32
   |
71 |         let mut orgdata = data & (!(0xFFu64 << self.shift) as i64);
   |                                ^ no implementation for `i32 & i64`
   |
   = help: the trait `std::ops::BitAnd<i64>` is not implemented for `i32`
   = help: the following other types implement trait `std::ops::BitAnd<Rhs>`:
             <i32 as std::ops::BitAnd>
             <i32 as std::ops::BitAnd<&i32>>
             <&'a i32 as std::ops::BitAnd<i32>>
             <&i32 as std::ops::BitAnd<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:72:20
   |
72 |         orgdata |= i64::from(self.data) << self.shift;
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `i32`, found `i64`
error[E0277]: no implementation for `i32 |= i64`
  --> src/process_handling/breakpoint.rs:72:17
   |
72 |         orgdata |= i64::from(self.data) << self.shift;
   |                 ^^ no implementation for `i32 |= i64`
   |
   = help: the trait `std::ops::BitOrAssign<i64>` is not implemented for `i32`
   = help: the following other types implement trait `std::ops::BitOrAssign<Rhs>`:
             <i32 as std::ops::BitOrAssign>
             <i32 as std::ops::BitOrAssign<&i32>>
error[E0308]: mismatched types
  --> src/process_handling/breakpoint.rs:73:55
   |
73 |         write_to_address(pid, self.aligned_address(), orgdata)
   |         ----------------                              ^^^^^^^ expected `i64`, found `i32`
   |         |
   |         arguments to this function are incorrect
   |
note: function defined here
  --> src/process_handling/ptrace_control.rs:42:8
   |
42 | pub fn write_to_address(pid: Pid, address: u64, data: i64) -> Result<()> {
   |        ^^^^^^^^^^^^^^^^                         ---------
help: you can convert an `i32` to an `i64`
   |
73 |         write_to_address(pid, self.aligned_address(), orgdata.into())
   |                                                              +++++++
Some errors have detailed explanations: E0277, E0308.
For more information about an error, try `rustc --explain E0277`.
error: could not compile `cargo-tarpaulin` (lib) due to 13 previous errors
warning: build failed, waiting for other jobs to finish...

https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/65625

@xd009642
Copy link
Owner

So I think the solution is a bit more liberal sprinkling of c_long and c_ulong just to keep the types as matched as possible. I tried to build it for i686 myself but unfortunately openssl doesn't like that and I haven't yet figured out a nice way to build it and check it builds myself.

I have pushed something to the fix/x86-build branch though if you want to try that out and see if it works - that might get things moving quicker

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants