﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
259	Finer granularity for OS/2 DLL dependency generator	dmik		"Currently, the OS/2 DLL dependency generator detects only DLL names for Requires/Provides but not the functions which are imported or exported. However, sometimes the import/export list of a DLL changes w/o changing its name. The most frequent case is addition of new exports.

Imagine a situation: LIB.DLL gets a new export FOO. This lib is released to a beta repository (not available for everyone) with `Provides: LIB.DLL` added by the dependency generator to its RPM. The same `Provides` existed for a previous version of this DLL before FOO was exported. A developer then builds some APP that requires LIB.DLL and happens to use the new export FOO just after rebuild (no change to the APP source is made) because it's an override (i.e. FOO exe was imported from some other lib before). The generator adds `Requires: LIB.DLL` to APP's RPM after analyzing the IMPORTS table of its EXE/DLL files. This APP is then released to a public repository. And if the user installs or updates this APP, the `LIB.DLL` dependency will be satisfied by an earlier version of LIB.DLL which lacks the FOO export, resulting in `export FOO not found` at runtime. A real-life example of this scenario is #257.

Note that this mostly applies to cases when new exports are added to a DLL because if there is a change or removal, the DLL becomes non-backward compatible which requires to change its name (and when the name changes, the dependency generator will update the dependency forcing the user to update the DLL as well).

A proposed solution is to increase granularity of the Provides/Requires records by adding not only the DLL name but the export name as well — using the parenthesis notation just like other generators (e.g. perl, python, pkg-config etc) do. So in the above imaginary case, the generator should add the following for the LIB.DLL RPM:
{{{
Provides: LIB.DLL
Provides: LIB.DLL(FOO)
}}}
And the following for the APP RPM:
{{{
Requires: LIB.DLL(FOO)
}}}
instead of just `LIB.DLL` as it does now.

This way, any potential problems related to export/import mismatches will be solved automatically and for all possible combination of package dependencies.

This is relatively easy to implement as all imports and exports are collected in the respective sections of EXE and DLL files in binary form (so it's fast to extract this information). The only potential problem I see is C++ DLLs which export huge amounts of C++ symbols (i.e. the Qt DLLs contain thousands of exports). But it doesn't sound too serious per se as RPM is designed to handle thousands of dependencies."	enhancement	closed	major		rpm		low	wontfix		
