From: "tagomoris (Satoshi Tagomori) via ruby-core" Date: 2023-11-28T07:48:13+00:00 Subject: [ruby-core:115501] [Ruby master Feature#20005] Add C API to return symbols of native extensions resolved from features Issue #20005 has been updated by tagomoris (Satoshi Tagomori). nobu (Nobuyoshi Nakada) wrote in #note-9: > `dln_sym` has been used only to resolve and call immediately `Init_xxx` functions, and it would be reasonable to split error handling. That makes sense. > > My expectation: libraries should raise LoadError under their own responsibility when this API returns NULL > > What do you mean by "libraries" here? I meant extensions, that call this API. The diff you pasted is really helpful. Just one point I have a question: ```diff +#define dln_sym_call(rettype, argtype, handle, symbol) \ + (*(rettype (*)argtype)dln_sym_func(handle, symbol)) ``` This actually does not call the symbol but returns a callable symbol. So I think it's better to either: A. rename it to `dln_sym_callable` B. add `()` at the end of the line, and remove `()` from the code about `"ruby_abi_version"` and `init_fct_name`. @nobu What do you think? ---------------------------------------- Feature #20005: Add C API to return symbols of native extensions resolved from features https://bugs.ruby-lang.org/issues/20005#change-105430 * Author: tagomoris (Satoshi Tagomori) * Status: Open * Priority: Normal ---------------------------------------- I want an API to resolve symbols of other native extensions by a feature name and a symbol name (just like `dlsym`). (`rb_dln_resolve_symbol` is an example function name of this feature in the example below) ```c // "a_client_open" is a function defined in "/..../a_client.so", that should be loaded in Ruby beforehand. // in the extension to be "a.so" VALUE (*a_client_open)(VALUE); void Init_a(void) { a_client_open = (VALUE(*)(VALUE))rb_dln_resolve_symbol("a_client", "a_client_open"); // the return value may be NULL if the symbols is not found } ``` This API is to replace direct reference of external symbols. Currently, native extensions have to just call the function of other extensions directly on the assumption of: * The dependency native extension is already loaded * The symbol is defined correctly in the dependency (the version of dependency is correct&expected) Otherwise, it crashes. This API provides a way for developers to raise exceptions if the resolved symbol is `NULL`, and these exceptions can display meaningful messages and instructions to the users of extensions. -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/