core::option must be in the standard library so that other standard library APIs can use them. For example,
Option is needed by the
Iterator trait. (Also, they need to implement the unstable
Try trait to support the
? operator, and unstable
Termination trait to support
fn main() -> Result.)
core::ops traits are all lang items to support operator overloading.
core::any relies on the unstable
core::pin::Pin is a lang item. (Is this needed for async/await? I'm not sure.)
core::clone::Clone is a lang item so that the
Copy trait can depend on it. Removing that relationship now would be a breaking change, though if it had been removed pre-1.0, I don't think it would cause any fundamental problems.
core::slice::from_raw_parts used to require unstable code to implement, but in Rust 1.42 and later it can be implemented in terms of
core::sync::atomic is implemented using unstable intrinsics.
At least some of
core::poll is needed for async/await.
Some core macros like
include! require compiler support.
libcore also contains inherent methods on built-in types, like
str::as_bytes, which use intrinsics or other unstable code.