Cross-compiling ? Aren't M1 and Pi both ARM processors ? I've been building apps for my M1 to run on Pi without any issue. Some optimization options maybe ?
Cross compiling is really defined as different platforms, not limiting it to instruction sets. Also, the M1 is an ARM, but the instruction sets aren't exactly the same.
If the app leverages the page size in some way you can get into very subtle crashes - app is built on M1 (with 16k page size), page size is stored in a constant in the binary because it's a macro, then you trt to access the entire range of a page in a pi (4k pages) - and things break.
Cross-compilling from MacOS to Linux. By default OCaml does dynamic linking of all C dependencies. Even with static linking there is a dependency on libc (or the MacOS equivalent) as far as I remember. I had some success so far with Rust, Nim and Go using a musl toolchain[1], but no luck for OCaml. At the moment I'm just using a docker container which mirrors the Debian distribution running on the Pi.