socketry / io-event

MIT License
75 stars 16 forks source link

Undefined symbol in IO_Event.so #58

Closed piperswe closed 1 year ago

piperswe commented 1 year ago

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

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 of inline will fix this? I'm not sure.

This is running inside a Docker dev container, based on Debian Bullseye.

ioquatix commented 1 year ago

Thanks I will take a look.

ioquatix commented 1 year ago

@piperswe can you please check the latest release and let me know if you are still having issues? Thanks!