- filter out non-library soname dependencies

This commit is contained in:
Panu Matilainen 2013-05-17 11:44:03 +03:00
parent e3501faaf5
commit b3bdf6087f
2 changed files with 87 additions and 1 deletions

View File

@ -0,0 +1,80 @@
commit 73bd9636d0e76a4d255776b7733667198b9ef585
Author: Panu Matilainen <pmatilai@redhat.com>
Date: Mon Jan 7 15:52:43 2013 +0200
Filter ELF dependencies by name
- Instead of vain heuristics on DT_SONAME presence, filter out
irregular sonames from all dependencies: linkable library names generally
must contain ".so" and start with "lib" for the linker to find it at all,
anything else is an exception of one kind or another (the prime exception
of ld.so variants we handle here). This weeds out provides for most
dlopen()'ed modules etc, and filtering both provides and requires
by the same rules means we wont generate requires for things that wont be
provided. Of course this also means we can omit things that are in
DT_NEEDED, but these should be rare exceptions which the new
--no-filter-soname switch is for.
diff --git a/tools/elfdeps.c b/tools/elfdeps.c
index fc9a905..a0db9f7 100644
--- a/tools/elfdeps.c
+++ b/tools/elfdeps.c
@@ -15,6 +15,7 @@
int filter_private = 0;
int soname_only = 0;
int fake_soname = 1;
+int filter_soname = 1;
typedef struct elfInfo_s {
Elf *elf;
@@ -36,6 +37,31 @@ static int skipPrivate(const char *s)
return (filter_private && rstreq(s, "GLIBC_PRIVATE"));
}
+/*
+ * Rough soname sanity filtering: all sane soname's dependencies need to
+ * contain ".so", and normal linkable libraries start with "lib",
+ * everything else is an exception of some sort. The most notable
+ * and common exception is the dynamic linker itself, which we allow
+ * here, the rest can use --no-filter-soname.
+ */
+static int skipSoname(const char *soname)
+{
+ if (filter_soname) {
+ if (!strstr(soname, ".so"))
+ return 1;
+
+ if (rstreqn(soname, "ld.", 3) || rstreqn(soname, "ld-", 3))
+ return 0;
+
+ if (rstreqn(soname, "lib", 3))
+ return 0;
+ else
+ return 1;
+ }
+
+ return 0;
+}
+
static const char *mkmarker(GElf_Ehdr *ehdr)
{
const char *marker = NULL;
@@ -58,6 +84,10 @@ static void addDep(ARGV_t *deps,
const char *soname, const char *ver, const char *marker)
{
char *dep = NULL;
+
+ if (skipSoname(soname))
+ return;
+
if (ver || marker) {
rasprintf(&dep,
"%s(%s)%s", soname, ver ? ver : "", marker ? marker : "");
@@ -293,6 +323,7 @@ int main(int argc, char *argv[])
{ "filter-private", 0, POPT_ARG_VAL, &filter_private, -1, NULL, NULL },
{ "soname-only", 0, POPT_ARG_VAL, &soname_only, -1, NULL, NULL },
{ "no-fake-soname", 0, POPT_ARG_VAL, &fake_soname, 0, NULL, NULL },
+ { "no-filter-soname", 0, POPT_ARG_VAL, &filter_soname, 0, NULL, NULL },
POPT_AUTOHELP
POPT_TABLEEND
};

View File

@ -21,7 +21,7 @@
Summary: The RPM package management system
Name: rpm
Version: %{rpmver}
Release: %{?snapver:0.%{snapver}.}4%{?dist}
Release: %{?snapver:0.%{snapver}.}5%{?dist}
Group: System Environment/Base
Url: http://www.rpm.org/
Source0: http://rpm.org/releases/testing/%{name}-%{srcver}.tar.bz2
@ -49,6 +49,8 @@ Patch6: rpm-4.9.0-armhfp-logic.patch
Patch100: 0001-Finish-lua-5.2-support-trac-865.patch
# Check for stale locks when opening write-cursors
Patch101: rpm-4.11.x-cursor-failchk.patch
# Filter soname dependencies by name
Patch102: rpm-4.11.x-filter-soname-deps.patch
# These are not yet upstream
Patch301: rpm-4.6.0-niagara.patch
@ -229,6 +231,7 @@ packages on a system.
%patch100 -p1 -b .lua-5.2
%patch101 -p1 -b .cursor-failchk
%patch102 -p1 -b .filter-soname-deps
%patch301 -p1 -b .niagara
%patch302 -p1 -b .geode
@ -462,6 +465,9 @@ exit 0
%doc COPYING doc/librpm/html/*
%changelog
* Fri May 17 2013 Panu Matilainen <pmatilai@redhat.com> - - 4.11.0.1-5
- filter out non-library soname dependencies
* Thu May 16 2013 Panu Matilainen <pmatilai@redhat.com> - - 4.11.0.1-4
- check for stale locks when opening write-cursors (#860500, #962750...)