And so now we have the start of Yet More peculier dependencies,
not just devel(...) but now uClibc(...).

Revert.

And get the fiddle ups in lib/psm.c for triggers
removed as well.

If you want hacked up RPM in Mandriva, by all means hack away.

Not here.

73 de Jeff

On Apr 16, 2011, at 10:29 AM, Per Øyvind Karlsen wrote:

>  RPM Package Manager, CVS Repository
>  http://rpm5.org/cvs/
>  ____________________________________________________________________________
> 
>  Server: rpm5.org                         Name:   Per Øyvind Karlsen
>  Root:   /v/rpm/cvs                       Email:  pkarl...@rpm5.org
>  Module: rpm                              Date:   16-Apr-2011 16:29:45
>  Branch: rpm-5_3                          Handle: 2011041614294401
> 
>  Modified files:           (Branch: rpm-5_3)
>    rpm                     CHANGES
>    rpm/lib                 rpmds.c
> 
>  Log:
>    add a uClibc(...) dependency for libraries linked against uClibc to
>    avoid conflicting duplicates (mandriva only for now)
> 
>  Summary:
>    Revision    Changes     Path
>    1.3296.2.213+2  -0      rpm/CHANGES
>    2.167.2.13  +249 -49    rpm/lib/rpmds.c
>  ____________________________________________________________________________
> 
>  patch -p0 <<'@@ .'
>  Index: rpm/CHANGES
>  ============================================================================
>  $ cvs diff -u -r1.3296.2.212 -r1.3296.2.213 CHANGES
>  --- rpm/CHANGES      12 Apr 2011 08:02:29 -0000      1.3296.2.212
>  +++ rpm/CHANGES      16 Apr 2011 14:29:45 -0000      1.3296.2.213
>  @@ -1,4 +1,6 @@
>   5.3.10 -> 5.3.11
>  +    - proyvind: add a uClibc(...) dependency for libraries linked against
>  +    uClibc to avoid conflicting duplicates (mandriva only for now)
>       - devzero2000: get rid of rindex everywhere: use SUSv3 strrchr instead
>       - devzero2000: add more gpg keys to thkp.c test program
>       - jbj: verify: re-add digest/signature checks.
>  @@ .
>  patch -p0 <<'@@ .'
>  Index: rpm/lib/rpmds.c
>  ============================================================================
>  $ cvs diff -u -r2.167.2.12 -r2.167.2.13 rpmds.c
>  --- rpm/lib/rpmds.c  11 Apr 2011 05:10:20 -0000      2.167.2.12
>  +++ rpm/lib/rpmds.c  16 Apr 2011 14:29:44 -0000      2.167.2.13
>  @@ -2891,7 +2891,234 @@
>    * @param isElf64   is this an ELF64 symbol?
>    */
>   #if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__)
>  -static char * sonameDep(/*@returned@*/ char * t, const char * s, int 
> isElf64)
>  +#if defined(RPM_VENDOR_MANDRIVA)
>  +static char * sonameDep(/*@returned@*/ char * t, const char * s, int 
> isElf64, int devel, int uClibc)
>  +    /*@modifies t @*/
>  +{
>  +    char *tmp = t;
>  +    *t = '\0';
>  +    if (uClibc)
>  +    tmp = stpcpy(tmp, "uClibc(");
>  +    if (devel) {
>  +    tmp = stpcpy(tmp, "devel(");
>  +    }
>  +#if !defined(__alpha__) && !defined(__sun)
>  +    if (!isElf64) {
>  +    /* XXX: eehhk, would've been nice with consistency, mandriva legacy... 
> :| */
>  +    if (!devel && s[strlen(s)-1] != ')')
>  +    (void) stpcpy( stpcpy(tmp, s), "()(64bit)");
>  +    else {
>  +        tmp = stpcpy(tmp, s);
>  +        if (devel)
>  +            tmp = strstr(t, ".so");
>  +        tmp = stpcpy(tmp, "(64bit)");
>  +        }
>  +    }else
>  +#endif
>  +    tmp = stpcpy(tmp, s);
>  +    if (devel) {
>  +    char *suffix = strstr(t, ".so");
>  +    if (suffix)
>  +        tmp = suffix;
>  +    tmp = stpcpy(tmp, ")");
>  +    }
>  +    if (uClibc)
>  +    tmp = stpcpy(tmp, ")");
>  +
>  +    return t;
>  +}
>  +
>  +static char *find_elf_interpreter(GElf_Ehdr *ehdr, Elf *elf, char *filename)
>  +{
>  +    FILE *fp = NULL;
>  +    struct stat statbuf;
>  +    GElf_Ehdr ehdr_mem;
>  +    GElf_Shdr shdr_mem, *shdr;
>  +    GElf_Phdr phdr_mem, *phdr;
>  +    GElf_Dyn dyn_mem, *dyn;
>  +    Elf_Data * data;
>  +    Elf_Scn *scn = NULL;
>  +    int fdno;
>  +    char *interp_name = NULL;
>  +    char *libpath = NULL;
>  +    int cnt;
>  +    int class;
>  +    size_t shstrndx;
>  +
>  +    if (filename) {
>  +    if (!(fp = fopen(filename, "r"))) {
>  +        perror(filename);
>  +        return NULL;
>  +    }
>  +    if (fstat((fdno = fileno(fp)), &statbuf) < 0) {
>  +        perror(filename);
>  +        goto end;
>  +    }
>  +    if ((size_t) statbuf.st_size < sizeof(Elf64_Ehdr) || 
> !S_ISREG(statbuf.st_mode))
>  +        goto foo;
>  +
>  +    (void) elf_version(EV_CURRENT);
>  +    elf = NULL;
>  +    if ((elf = elf_begin (fdno, ELF_C_READ, NULL)) == NULL
>  +            || elf_kind(elf) != ELF_K_ELF
>  +            || (ehdr = gelf_getehdr(elf, &ehdr_mem)) == NULL
>  +            || !(ehdr->e_type == ET_DYN || ehdr->e_type == ET_EXEC))
>  +        goto end;
>  +    }
>  +foo:
>  +
>  +    if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) {
>  +    fprintf(stderr, "%s: not a dynamic executable\n", filename);
>  +    goto end;
>  +    }
>  +    class = gelf_getclass(elf);
>  +
>  +    for (cnt = 0; cnt < ehdr->e_phnum; cnt++) {
>  +    phdr = gelf_getphdr (elf, cnt, &phdr_mem);
>  +    if (phdr->p_type == PT_INTERP)
>  +        break;
>  +    phdr = NULL;
>  +    }
>  +    if (phdr) {
>  +    Elf_Data *data = NULL;
>  +
>  +    scn = gelf_offscn (elf, phdr->p_offset);
>  +    shdr = gelf_getshdr(scn, &shdr_mem);
>  +    data = elf_getdata (scn, data);
>  +    interp_name = strdup(data->d_buf);
>  +    goto end;
>  +    }
>  +
>  +    if (elf_getshdrstrndx (elf, &shstrndx) >= 0)
>  +    while ((scn = elf_nextscn(elf, scn)) != NULL) {
>  +        shdr = gelf_getshdr(scn, &shdr_mem);
>  +        if (shdr->sh_type == SHT_DYNAMIC) {
>  +            char *rpath = NULL;
>  +            for (cnt = 0; cnt < ehdr->e_phnum; cnt++) {
>  +                phdr = gelf_getphdr (elf, cnt, &phdr_mem);
>  +                if (phdr->p_type == PT_LOAD)
>  +                    break;
>  +            }
>  +
>  +            data = NULL;
>  +            while ((data = elf_getdata (scn, data)) != NULL) {
>  +                int dynsize = (int)(shdr->sh_size / shdr->sh_entsize)-1;
>  +                for (cnt = 0; cnt <= dynsize; ++cnt) {
>  +                    dyn = gelf_getdyn (data, cnt, &dyn_mem);
>  +
>  +                    if (rpath == NULL) {
>  +                        if (dyn->d_tag == DT_RPATH)
>  +                            rpath = elf_strptr (elf, shdr->sh_link, 
> dyn->d_un.d_val);
>  +                        else if (cnt == dynsize)
>  +                            rpath = "";
>  +                        if (rpath != NULL)
>  +                            cnt = -1;
>  +                        continue;
>  +                    }
>  +                    else if (rpath && DT_NEEDED == dyn->d_tag) {
>  +                        char *tmp, *tmp2;
>  +                        char buf[1024];
>  +                        char path[1024] = "";
>  +
>  +                        libpath = elf_strptr (elf, shdr->sh_link, 
> dyn->d_un.d_val);
>  +
>  +                        if (!libpath || !strlen(libpath))
>  +                            continue;
>  +
>  +                        tmp = libpath;
>  +                        while (*tmp) {
>  +                            if (*tmp == '/')
>  +                                libpath = tmp + 1;
>  +                            tmp++;
>  +                        }
>  +
>  +                        /* If this is a fully resolved name, we don't need 
> to modify the path */
>  +                        if (stat(libpath, &statbuf) == 0)
>  +                            continue;
>  +
>  +                        tmp2 = path;
>  +                        if (rpath && *rpath) {
>  +                            tmp2 = stpcpy(tmp2, rpath);
>  +                            tmp2 = stpcpy(tmp2, ":");
>  +                        }
>  +                        tmp = getenv("LD_LIBRARY_PATH");
>  +                        if (tmp)
>  +                            tmp2 = stpcpy(tmp2, tmp);
>  +                        if ((rpath && *rpath) || tmp)
>  +                            tmp2 = stpcpy(tmp2, ":");
>  +                        /* XXX: do better check to ensure libraries are all 
> of the same class */
>  +                        tmp2 = stpcpy(tmp2, (class == ELFCLASS64) ? 
> "/lib64" : "/lib");
>  +                        tmp = buf;
>  +                        {
>  +                            int i, count = 1;
>  +                            char *path_n;
>  +
>  +                            /* Eliminate all double //s */
>  +                            path_n = path;
>  +                            while ((path_n = strstr(path_n, "//"))) {
>  +                                i = strlen(path_n);
>  +                                memmove(path_n, path_n + 1, i - 1);
>  +                                *(path_n + i - 1) = '\0';
>  +                            }
>  +
>  +                            /* Replace colons with zeros in path_list and 
> count them */
>  +                            for (i = strlen(path); i > 0; i--) {
>  +                                if (path[i] == ':') {
>  +                                    path[i] = 0;
>  +                                    count++;
>  +                                }
>  +                            }
>  +                            path_n = path;
>  +                            for (i = 0; i < count; i++) {
>  +                                strcpy(tmp, path_n);
>  +                                strcat(tmp, "/");
>  +                                strcat(tmp, libpath);
>  +                                if (stat(tmp, &statbuf) == 0 && 
> statbuf.st_mode & S_IRUSR) {
>  +                                    path[0] = '\0';
>  +                                    break;
>  +                                }
>  +                                path_n += (strlen(path_n) + 1);
>  +                            }
>  +                            if(path[0])
>  +                                *tmp = '\0';
>  +                        }
>  +                        libpath = buf;
>  +                    }
>  +                }
>  +            }
>  +            break;
>  +        }
>  +    }
>  +
>  +end:
>  +    if (fp) {
>  +    if (elf) (void) elf_end(elf);
>  +    fclose(fp);
>  +    }
>  +    if (!interp_name && libpath)
>  +    return find_elf_interpreter(NULL, NULL, libpath);
>  +    return interp_name;
>  +}
>  +
>  +static int checkuClibc(GElf_Ehdr *ehdr, Elf *elf) {
>  +    int ret = 0;
>  +    char *interp = find_elf_interpreter(ehdr, elf, NULL);
>  +
>  +    if (interp) {
>  +    char *tmp = basename(interp);
>  +    if (tmp[0] == 'l' && tmp[1] == 'd') {
>  +        tmp += ((tmp[2] == '3' && tmp[3] == '2') ||
>  +                (tmp[2] == '6' && tmp[3] == '4')) ?
>  +            5 : 7;
>  +        if (!strncasecmp(tmp, "uClibc.so", sizeof("uClibc.so")-1))
>  +            ret = 1;
>  +    }
>  +    free(interp);
>  +    }
>  +    return ret;
>  +}
>  +#else
>  +static char * sonameDep(/*@returned@*/ char * t, const char * s, int 
> isElf64, int devel, int uClibc)
>       /*@modifies t @*/
>   {
>       *t = '\0';
>  @@ -2907,6 +3134,7 @@
>       return t;
>   }
>   #endif
>  +#endif
> 
>   /*@-moduncon -noeffectuncon @*/
>   int rpmdsELF(const char * fn, int flags,
>  @@ -2935,6 +3163,7 @@
>       int xx;
>       int isElf64;
>       int isDSO;
>  +    int isuClibc;
>       int gotSONAME = 0;
>       int gotDEBUG = 0;
>       int gotHASH = 0;
>  @@ -2977,6 +3206,11 @@
> 
>       isElf64 = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
>       isDSO = ehdr->e_type == ET_DYN;
>  +#if defined(RPM_VENDOR_MANDRIVA)
>  +    isuClibc = checkuClibc(ehdr, elf);
>  +#else
>  +    isuClibc = 0;
>  +#endif
> 
>       /*@-uniondef @*/
>       scn = NULL;
>  @@ -3075,7 +3309,7 @@
> 
>                           /* Add next provide dependency. */
>                           ds = rpmdsSingle(RPMTAG_PROVIDES,
>  -                                    sonameDep(t, buf, isElf64),
>  +                                    sonameDep(t, buf, isElf64, 0, isuClibc),
>                                       "", RPMSENSE_FIND_PROVIDES);
>                           xx = add(context, ds);
>                           (void)rpmdsFree(ds);
>  @@ -3128,7 +3362,7 @@
> 
>                           /* Add next require dependency. */
>                           ds = rpmdsSingle(RPMTAG_REQUIRENAME,
>  -                                    sonameDep(t, buf, isElf64),
>  +                                    sonameDep(t, buf, isElf64, 0, isuClibc),
>                                       "", RPMSENSE_FIND_REQUIRES);
>                           xx = add(context, ds);
>                           (void)rpmdsFree(ds);
>  @@ -3170,7 +3404,7 @@
>   assert(s != NULL);
>                       buf[0] = '\0';
>                       ds = rpmdsSingle(RPMTAG_REQUIRENAME,
>  -                            sonameDep(buf, s, isElf64),
>  +                            sonameDep(buf, s, isElf64, 0, isuClibc),
>                               "", RPMSENSE_FIND_REQUIRES);
>                       xx = add(context, ds);
>                       (void)rpmdsFree(ds);
>  @@ -3185,7 +3419,7 @@
>                       /* Add next provide dependency. */
>                       buf[0] = '\0';
>                       ds = rpmdsSingle(RPMTAG_PROVIDENAME,
>  -                            sonameDep(buf, s, isElf64),
>  +                            sonameDep(buf, s, isElf64, 0, isuClibc),
>                               "", RPMSENSE_FIND_PROVIDES);
>                       xx = add(context, ds);
>                       (void)rpmdsFree(ds);
>  @@ -3221,7 +3455,7 @@
>       /* Add next provide dependency. */
>       buf[0] = '\0';
>       ds = rpmdsSingle(RPMTAG_PROVIDENAME,
>  -            sonameDep(buf, s, isElf64), "", RPMSENSE_FIND_PROVIDES);
>  +            sonameDep(buf, s, isElf64, 0, isuClibc), "", 
> RPMSENSE_FIND_PROVIDES);
>       xx = add(context, ds);
>       (void)rpmdsFree(ds);
>       ds = NULL;
>  @@ -3241,46 +3475,6 @@
> 
> 
>   #if defined(RPM_VENDOR_MANDRIVA)
>  -/**
>  - * Return a soname dependency constructed from an elf string, 
> Mandriva-style.
>  - * @retval t                soname dependency
>  - * @param s         elf string (NULL uses "")
>  - * @param isElf64   is this an ELF64 symbol?
>  - */
>  -#if defined(HAVE_GELF_H) && defined(HAVE_LIBELF) && !defined(__FreeBSD__)
>  -static char * mdvSonameDep(/*@returned@*/ char * t, const char * s, int 
> isElf64, int devel)
>  -    /*@modifies t @*/
>  -{
>  -    char *tmp = t;
>  -    *t = '\0';
>  -    if (devel) {
>  -    tmp = stpcpy(t, "devel(");
>  -    }
>  -#if !defined(__alpha__) && !defined(__sun)
>  -    if (!isElf64) {
>  -    /* XXX: eehhk, would've been nice with consistency, mandriva legacy... 
> :| */
>  -    if (!devel && s[strlen(s)-1] != ')')
>  -    (void) stpcpy( stpcpy(tmp, s), "()(64bit)");
>  -    else {
>  -        tmp = stpcpy(tmp, s);
>  -        if (devel)
>  -            tmp = strstr(t, ".so");
>  -        tmp = stpcpy(tmp, "(64bit)");
>  -        }
>  -    }else
>  -#endif
>  -    tmp = stpcpy(tmp, s);
>  -    if (devel) {
>  -    char *suffix = strstr(t, ".so");
>  -    if (suffix)
>  -        tmp = suffix;
>  -    tmp = stpcpy(tmp, ")");
>  -    }
>  -
>  -    return t;
>  -}
>  -#endif
>  -
>   /** \ingroup rpmds
>    * Extract dependencies from a symlink.
>    * XXX Prototype added to keep GCC quiet and avoid adding a symbol.
>  @@ -3314,6 +3508,7 @@
>       rpmds ds;
>       int xx;
>       int isElf64;
>  +    int isuClibc;
>       int gotSONAME = 0;
>       int skipP = (flags & RPMELF_FLAG_SKIPPROVIDES);
>       int skipR = (flags & RPMELF_FLAG_SKIPREQUIRES);
>  @@ -3368,6 +3563,11 @@
>   /*@=evalorder@*/
> 
>       isElf64 = ehdr->e_ident[EI_CLASS] == ELFCLASS64;
>  +#if defined(RPM_VENDOR_MANDRIVA)
>  +    isuClibc = checkuClibc(ehdr, elf);
>  +#else
>  +    isuClibc = 0;
>  +#endif
> 
>       /*@-uniondef @*/
>       scn = NULL;
>  @@ -3403,7 +3603,7 @@
>                       buf[0] = '\0';
> 
>                       for (i = 0; i < 
> (int)(sizeof(filterRequires)/sizeof(filterRequires[0])); i++)
>  -                        if (!strncmp(s, filterRequires[i], 
> strlen(filterRequires[i])))
>  +                        if (!strncmp(s, filterRequires[i], 
> strlen(filterRequires[i])) && !isuClibc)
>                               break;
> 
>                       if (sizeof(filterRequires)/sizeof(filterRequires[0]) == 
> i)
>  @@ -3418,7 +3618,7 @@
> 
>                       if (!skipP) {
>                           ds = rpmdsSingle(RPMTAG_PROVIDENAME,
>  -                                mdvSonameDep(buf, s, isElf64, 1),
>  +                                sonameDep(buf, s, isElf64, 1, isuClibc),
>                                   "", RPMSENSE_FIND_PROVIDES);
>                           xx = add(context, ds);
>                           (void)rpmdsFree(ds);
>  @@ -3437,7 +3637,7 @@
>       if (gotSONAME && !skipR)
>       for (i = 0, cnt = argvCount(deps); i < cnt; i++) {
>           ds = rpmdsSingle(RPMTAG_REQUIRENAME,
>  -                mdvSonameDep(buf, deps[i], isElf64, 1),
>  +                sonameDep(buf, deps[i], isElf64, 1, isuClibc),
>                   "", RPMSENSE_FIND_REQUIRES);
>           xx = add(context, ds);
>           (void)rpmdsFree(ds);
>  @@ .
> ______________________________________________________________________
> RPM Package Manager                                    http://rpm5.org
> CVS Sources Repository                                rpm-...@rpm5.org

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to