I'm looking to try out the Falcon HTTP server, and it uses io-event via async. When I try to launch my server, I receive the following error:
ruby: symbol lookup error: /usr/local/bundle/ruby/3.2.0/gems/io-event-1.2.0/lib/IO_Event.so: undefined symbol: IO_Event_Interrupt_descriptor
IO_Event.so looks reasonable, except that the IO_Event_Interrupt_descriptor symbol is in fact undefined:
$ ldd /usr/local/bundle/ruby/3.2.0/gems/io-event-1.2.0/lib/IO_Event.so
linux-vdso.so.1 (0x00007ffdc57fb000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007effa13f7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007effa1223000)
/lib64/ld-linux-x86-64.so.2 (0x00007effa142e000)
$ nm -gD /usr/local/bundle/ruby/3.2.0/gems/io-event-1.2.0/lib/IO_Event.so
0000000000009248 D IO_Event
00000000000044e0 T IO_Event_Interrupt_add
000000000000581f T IO_Event_Interrupt_clear
00000000000057a4 T IO_Event_Interrupt_close
U IO_Event_Interrupt_descriptor
0000000000005773 T IO_Event_Interrupt_open
00000000000057c0 T IO_Event_Interrupt_signal
0000000000009250 D IO_Event_Selector
000000000000443c T IO_Event_Selector_EPoll_Type_free
00000000000043d6 T IO_Event_Selector_EPoll_Type_mark
000000000000446b T IO_Event_Selector_EPoll_Type_size
000000000000447a T IO_Event_Selector_EPoll_allocate
000000000000461a T IO_Event_Selector_EPoll_close
0000000000004540 T IO_Event_Selector_EPoll_initialize
0000000000004dab T IO_Event_Selector_EPoll_io_read
0000000000004e60 T IO_Event_Selector_EPoll_io_read_compatible
0000000000004ade T IO_Event_Selector_EPoll_io_wait
000000000000505d T IO_Event_Selector_EPoll_io_write
0000000000005112 T IO_Event_Selector_EPoll_io_write_compatible
00000000000045e6 T IO_Event_Selector_EPoll_loop
0000000000004861 T IO_Event_Selector_EPoll_process_wait
0000000000004720 T IO_Event_Selector_EPoll_push
0000000000004769 T IO_Event_Selector_EPoll_raise
00000000000047b2 T IO_Event_Selector_EPoll_ready_p
000000000000469e T IO_Event_Selector_EPoll_resume
0000000000005355 T IO_Event_Selector_EPoll_select
0000000000004658 T IO_Event_Selector_EPoll_transfer
00000000000054c6 T IO_Event_Selector_EPoll_wakeup
00000000000046e7 T IO_Event_Selector_EPoll_yield
0000000000003f7f T IO_Event_Selector_current_time
0000000000003ed8 T IO_Event_Selector_elapsed_time
00000000000036fc T IO_Event_Selector_fiber_transfer
000000000000384c T IO_Event_Selector_nonblock_restore
00000000000037f8 T IO_Event_Selector_nonblock_set
00000000000037ac T IO_Event_Selector_process_status_wait
0000000000003e17 T IO_Event_Selector_queue_flush
0000000000003ccf T IO_Event_Selector_queue_push
0000000000003c34 T IO_Event_Selector_raise
0000000000003b43 T IO_Event_Selector_resume
0000000000003545 T Init_IO_Event
0000000000003903 T Init_IO_Event_Selector
000000000000551a T Init_IO_Event_Selector_EPoll
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w __cxa_finalize@GLIBC_2.2.5
U __errno_location@GLIBC_2.2.5
w __gmon_start__
U clock_gettime@GLIBC_2.17
U close@GLIBC_2.2.5
U dup@GLIBC_2.2.5
U epoll_create1@GLIBC_2.9
U epoll_ctl@GLIBC_2.3.2
U epoll_wait@GLIBC_2.3.2
U eventfd@GLIBC_2.7
U fcntl@GLIBC_2.2.5
U fprintf@GLIBC_2.2.5
U free@GLIBC_2.2.5
U malloc@GLIBC_2.2.5
U rb_cIO
U rb_cObject
U rb_check_typeddata
U rb_const_get
U rb_const_get_at
U rb_data_typed_object_zalloc
U rb_define_alloc_func
U rb_define_class_under
w rb_define_method
U rb_define_module_under
w rb_define_singleton_method
U rb_eRuntimeError
U rb_ensure
U rb_error_arity
U rb_ext_ractor_safe
U rb_fiber_alive_p
U rb_fiber_current
U rb_fiber_raise
U rb_fiber_transfer
U rb_fix2int
U rb_float_value
U rb_funcall
U rb_funcallv
U rb_gc_mark
U rb_gc_register_mark_object
U rb_intern2
U rb_io_buffer_get_bytes_for_reading
U rb_io_buffer_get_bytes_for_writing
U rb_io_descriptor
U rb_mProcess
U rb_num2int
U rb_num2long
U rb_num2ull
U rb_obj_is_fiber
U rb_raise
U rb_sys_fail
U rb_thread_call_without_gvl
U rb_ull2inum
U rb_update_max_fd
U rb_yield
U read@GLIBC_2.2.5
U stderr@GLIBC_2.2.5
U strlen@GLIBC_2.2.5
U syscall@GLIBC_2.2.5
U write@GLIBC_2.2.5
I'm looking to try out the Falcon HTTP server, and it uses io-event via async. When I try to launch my server, I receive the following error:
IO_Event.so
looks reasonable, except that theIO_Event_Interrupt_descriptor
symbol is in fact undefined:It looks like it's supposed to be an inline function (https://github.com/socketry/io-event/blob/main/ext/io/event/interrupt.h#L30). Perhaps adding
static
in front ofinline
will fix this? I'm not sure.This is running inside a Docker dev container, based on Debian Bullseye.