[foreign] RFC: Jextract -l options ignored by SymbolFilter when -L is not specified

Jorn Vernee jbvernee at xs4all.nl
Tue Jan 22 19:20:43 UTC 2019


This also seems the most natural to me, since it follows what the linker 
flags do.

-L is to specify additional linker directories. We would consider 
java.library.path to be the "default"/"system" directories.

This is also what I tried to do in the patch [1] (minor update). With 
the addition of emitting a warning that symbol filtering is disabled 
when -l is used but no library paths are available (either in -L options 
or in java.library.path).

That said, I think having an extra option to explicitly turn on, or off, 
the symbol checking is a good idea as well.

Jorn

[1]: 
http://cr.openjdk.java.net/~jvernee/panama/webrevs/jlibpath/webrev.02/

Henry Jen schreef op 2019-01-22 17:40:
> It is preferred to keep options compatible with cc when applicable.
> 
> -L is only to provide the path for library at tooling time, that’s 
> jextract.
> —infer-path is similar to -R, will record the path for searching at
> runtime, that’s is, the path specified with -L will be added into
> search path of library.
> 
> As symbol check, it should be enabled with -l. -L is simply provide
> extra path to search for the library, without -L, it will simply
> search in java.library.path.
> 
> Cheers,
> Henry
> 
> 
>> On Jan 22, 2019, at 4:31 AM, Maurizio Cimadamore 
>> <maurizio.cimadamore at oracle.com> wrote:
>> 
>> 
>> On 22/01/2019 12:09, Jorn Vernee wrote:
>>> This sounds good, I really like the idea of a separate option to 
>>> enable the symbol filtering. But can you share what you think the 
>>> role of java.library.path should be as well?
>> 
>> I think using java.library.path as a default for the missing symbol 
>> check could be ok. But I don't think it would be ok to use it as a 
>> basis for infer-rpath. That is, I don't want static properties (e.g. 
>> valid at extraction time) to spill onto the runtime. If the user 
>> really wants to set some dynamic property, it has to use an explicit 
>> flag to do so (e.g. -L).
>> 
>> Maurizio
>> 
>>> 
>>> Jorn
>>> 
>>> Maurizio Cimadamore schreef op 2019-01-22 12:58:
>>>> Looking at this, I remember being confused about this too.
>>>> 
>>>> Let me try to see if we can find a better stacking for the existing
>>>> options - as Sundar said, we currently have:
>>>> 
>>>> * -l
>>>> 
>>>> This option is used to specify library _names_.
>>>> 
>>>> The main goal of this option is to alter the contents of the
>>>> @NativeHeader annotation (by adding the library name) but there are,
>>>> as we shall see, other subtle side-effects.
>>>> 
>>>> * -L + -l
>>>> 
>>>> When both -L and -l are specified, the so called "missing symbols
>>>> check" will kick in,  that is, jextract will check that all symbols 
>>>> in
>>>> the library are indeed defined in the header files being extracted. 
>>>> A
>>>> subtle side-effect of that check, is that when -l and -L are 
>>>> specified
>>>> together, and the missing symbol check is enabled, jextract will 
>>>> warn
>>>> for symbols not found and _it will exclude them_ from the extracted
>>>> classfile (w/o need for --include-symbols or --exclude-symbols).
>>>> 
>>>> * -L + -l + -infer-rpath
>>>> 
>>>> When -L and -l are used together, and the -infer-rpath option is
>>>> given, a runtime library path will be inferred from the contents of
>>>> -L, and will be stored in @NativeHeader, so that the binder can use
>>>> it.
>>>> 
>>>> 
>>>> I think the status quo is a bit confusing - because -L has multiple
>>>> functions (it serves up the library paths to be used as inferred
>>>> rpaths, and it also serves up the library paths to be used for the
>>>> missing symbol check). I think a more consistent stacking could be
>>>> something like this:
>>>> 
>>>> -l --> used to specify library _names_; only side-effect is contents
>>>> of @NativeHeader
>>>> 
>>>> -L --> used to specify _custom_ library _paths_; no side-effects
>>>> 
>>>> -exclude-missing -> must be used in conjunction with -l and -L ;
>>>> enables the missing symbol check and auto-exclusion
>>>> 
>>>> -infer-rpath -> must be used in conjunction with -l and -L ; enables
>>>> rpath inference (rpath inferred with paths specified in -L)
>>>> 
>>>> 
>>>> Thoughts?
>>>> 
>>>> Maurizio
>>>> 
>>>> 
>>>> On 22/01/2019 05:41, Sundararajan Athijegannathan wrote:
>>>>> I don't think it is a bug - afaik it is as per design. The primary 
>>>>> use of "-l" is to record the library in annotation of the generated 
>>>>> jar - so that binder can auto-load the library (either from 
>>>>> java.library.path configuration or -rpath value recorded in 
>>>>> annotation).  It is okay to record name of the shared object alone 
>>>>> and leave the library path configuration to java.library.path 
>>>>> setting.
>>>>> 
>>>>> "-L" option is added feature to perform missing symbols checking. 
>>>>> "-rpath" option is to add a path for library search - so that 
>>>>> binder can locate the shared object in the specific directory. If 
>>>>> no -rpath is specified, "-L" is used for runtime search as well.
>>>>> 
>>>>> -Sundar
>>>>> 
>>>>> On 22/01/19, 12:01 AM, Jorn Vernee wrote:
>>>>>> Hi,
>>>>>> 
>>>>>> I've recently updated the instructions for using libraries on 
>>>>>> Windows. For python the jextract example I gave was:
>>>>>> 
>>>>>>     jextract -l python27 -o "python.jar" -t "org.python" 
>>>>>> C:\Python27\include\Python.h
>>>>>> 
>>>>>> I'm lacking an `-L` option here (for specifying library 
>>>>>> directories) since the contents of PATH seems to be added to 
>>>>>> java.library.path by default, and this is presumably also how 
>>>>>> jextract is able to load the library. But, since I'm not using an 
>>>>>> `-L` option, SymbolFilter is not checking if the symbols are in 
>>>>>> the python27.dll [1]
>>>>>> 
>>>>>>     private void initSymChecker(List<String> linkCheckPaths) {
>>>>>>         if (!libraryNames.isEmpty() && !linkCheckPaths.isEmpty()) 
>>>>>> {
>>>>>>             // ... init symChecker
>>>>>>         } else {
>>>>>>             symChecker = null;
>>>>>>         }
>>>>>>     }
>>>>>> 
>>>>>> (linkCheckPaths comes from the -L option values)
>>>>>> 
>>>>>> This behaviour is somewhat unexpected. At least a warning that 
>>>>>> missing an `-L` option will turn off symbol checking would be 
>>>>>> nice.
>>>>>> 
>>>>>> We could also add the paths in `java.library.path` to the list of 
>>>>>> link check paths in jextract [2]. That would mean that the symbol 
>>>>>> checker would run for the example command.
>>>>>> 
>>>>>> What do you think?
>>>>>> 
>>>>>> Jorn
>>>>>> 
>>>>>> [1] : 
>>>>>> http://hg.openjdk.java.net/panama/dev/file/eaca2d16b80b/src/jdk.jextract/share/classes/com/sun/tools/jextract/SymbolFilter.java#l89
>>>>>> [2] : 
>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/jlibpath/webrev.01/


More information about the panama-dev mailing list