Skip to content

Missing epoll.h when compiling grpc library to wasm #18671

@Han-zb

Description

@Han-zb

I want to compile grpc library to wasm in order to build standalone wasm applications linking against libgrpc.a, and run it in wasmtime.

tools version:
emsdk: 3.1.31
cmake: 3.25.0

Run emcmake cmake .. and emmake make in grpc source directory with compile arguments STANDALONE_WASM and --no-entry, then got the error "epoll.h not found":

In file included from /home/xxx/grpc_emscripten/grpc/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc:16:
/home/xxx/grpc_emscripten/grpc/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h:38:10: fatal error: 'sys/epoll.h' file not found
#include <sys/epoll.h>
         ^~~~~~~~~~~~~
25 warnings and 1 error generated.
em++: error: '/home/xxx/emsdk/upstream/bin/clang++ -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -DEMSCRIPTEN -I/home/xxx/emsdk/upstream/emscripten/cache/sysroot/include/SDL --sysroot=/home/xxx/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/compat -DCARES_STATICLIB -I/home/xxx/grpc_emscripten/grpc/third_party/re2 -I/home/xxx/grpc_emscripten/grpc/third_party/zlib -I/home/xxx/grpc_emscripten/grpc/include -I/home/xxx/grpc_emscripten/grpc -I/home/xxx/grpc_emscripten/grpc/third_party/address_sorting/include -I/home/xxx/grpc_emscripten/grpc/build/third_party/re2 -I/home/xxx/grpc_emscripten/grpc/third_party/boringssl-with-bazel/src/include -I/home/xxx/grpc_emscripten/grpc/src/core/ext/upb-generated -I/home/xxx/grpc_emscripten/grpc/src/core/ext/upbdefs-generated -I/home/xxx/grpc_emscripten/grpc/third_party/upb -I/home/xxx/grpc_emscripten/grpc/third_party/xxhash -I/home/xxx/grpc_emscripten/grpc/build/third_party/zlib -I/home/xxx/grpc_emscripten/grpc/build/third_party/cares/cares -I/home/xxx/grpc_emscripten/grpc/third_party/cares/cares -I/home/xxx/grpc_emscripten/grpc/third_party/cares/cares/include -I/home/xxx/grpc_emscripten/grpc/third_party/abseil-cpp -fPIC -std=gnu++14 -MD -MT CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o -MF CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o.d -c /home/xxx/grpc_emscripten/grpc/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc -o CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o' failed (returned 1)
make[2]: *** [CMakeFiles/grpc.dir/build.make:7112: CMakeFiles/grpc.dir/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:1124: CMakeFiles/grpc.dir/all] Error 2
make: *** [Makefile:156: all] Error 2
emmake: error: 'make' failed (returned 2)

In order to compile successfully, I just added epoll.h and eventfd.h in emsdk include/sys directory and got libgrpc.a, although I know it may fail In the phase of link.

As expected, when built my demo.cpp, I got error when link against libgrpc:

configure: cmake .. -DCMAKE_CXX_FLAGS=-std=c++17 -DCMAKE_TOOLCHAIN_FILE=/home/xxx/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR=/home/xxx/emsdk/node/14.18.2_64bit/bin/node;--experimental-wasm-bulk-memory;--experimental-wasm-threads
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: /home/xxx/code_test/grpc_test_wasm/build
make: make
[ 14%] Building CXX object CMakeFiles/hw_grpc_proto.dir/protobuf/grpc_test.grpc.pb.cc.o
[ 28%] Building CXX object CMakeFiles/hw_grpc_proto.dir/protobuf/grpc_test.pb.cc.o
[ 42%] Linking CXX static library libhw_grpc_proto.a
[ 42%] Built target hw_grpc_proto
[ 57%] Building CXX object CMakeFiles/server.dir/server.cpp.o
[ 71%] Linking CXX executable server.wasm
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_read
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_write
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_wait
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_create1
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_read
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(wakeup_fd_eventfd.cc.o): undefined symbol: eventfd_write
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_create1
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_ctl
wasm-ld: error: /home/xxx/grpc_emscripten/grpc/build/libgrpc.a(ev_epoll1_linux.cc.o): undefined symbol: epoll_wait
em++: error: '/home/xxx/emsdk/upstream/bin/wasm-ld @/tmp/emscripten_k16or6kb.rsp.utf-8' failed (returned 1)
make[2]: *** [CMakeFiles/server.dir/build.make:101: server.wasm] Error 1
make[1]: *** [CMakeFiles/Makefile2:113: CMakeFiles/server.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
emmake: error: 'make' failed (returned 2)

I think the reason is that there is no epoll.h functions in libc.a. So I try to recompile the musl/libc in emsdk with epoll files, but it turns out that the directories and Make files in /home/hzb/emsdk/upstream/emscripten/system/lib/libc/musl missing some files and doesn't support for wasm32

root@pekphis292586:/home/xxx/emsdk/upstream/emscripten/system/lib/libc/musl# emconfigure ./configure --prefix=./my_install --exec-prefix=./my_binary --syslibdir=./my_lib/
configure: ./configure --prefix=./my_install --exec-prefix=./my_binary --syslibdir=./my_lib/
./configure: error: chosen malloc implementation 'mallocng' does not exist
emconfigure: error: './configure --prefix=./my_install --exec-prefix=./my_binary --syslibdir=./my_lib/' failed (returned 1)

learned from #17638, emscripten doesn't supprt epoll system calls, but I found poll system calls in libc.a:

poll.o:
00000000 d .debug_abbrev
00000000 d .debug_line
00000000 d .debug_str
         U __stack_pointer
         U __syscall_poll
         U __syscall_ret
00000001 T poll

I wonder,

  1. If epoll.h is added to the musl/libc source and recompiled, can epoll system calls be supported? (which I failed recompile) or why not?
  2. If not, maybe I need to change epoll to poll in grpc source code to avoid epoll.

I appreciate any reply and suggestions. Thanks.

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