# --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: package/.../binutils/ld-glob.patch # Copyright (C) 2006 The OpenSDE Project # Copyright (C) 2004 - 2006 The T2 SDE Project # # More information can be found in the files COPYING and README. # # This patch file is dual-licensed. It is available under the license the # patched project is licensed under, as long as it is an OpenSource license # as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms # of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or (at your option) any later # version. # --- SDE-COPYRIGHT-NOTE-END --- This adds /etc/ld.so.conf globbing to the gnu linker. We need this, since we also patch the glibc's dynamic linker and the linker needs to be able to scan the directories, too. - Rene Rebe --- binutils-2.15.94.0.1/ld/emultempl/elf32.em 2004-11-22 21:33:33.000000000 +0100 +++ binutils-2.15.94.0.1-glob/ld/emultempl/elf32.em 2004-12-23 23:40:56.549479128 +0100 @@ -633,7 +633,7 @@ } while (c != '\0'); } - else + else /* normal dir (e.g. no include) */ { char *dir = p; while (*p && *p != '=' && *p != ' ' && *p != '\t' && *p != '\f' @@ -642,14 +642,48 @@ while (p != dir && p[-1] == '/') --p; - if (info->path == NULL) + + /* cut trailing comments and such */ + p[1] = 0; + + /* assume path is a pattern - compare with quite equal glibc patch + -ReneR */ + + glob_t result; + #ifdef GLOB_ONLYDIR + if (glob(dir, GLOB_ONLYDIR, NULL, &result) == 0) { + #else + if (glob(dir, 0, NULL, &result) == 0) { + #endif + size_t j; + for (j = 0; j < result.gl_pathc; j++) { + char* x = result.gl_pathv[j]; + + if (info->path == NULL) { + info->alloc = strlen(x) + 256; + info->path = xmalloc (info->alloc); + info->len = 0; + } + else { + if (info->len + 1 + strlen(x) + 1 >= info->alloc) { + info->alloc += strlen(x) + 1 + 256; + info->path = xrealloc (info->path, info->alloc); + } + info->path[info->len++] = ':'; + } + strcpy (info->path + info->len, x); + info->len += strlen(x); + + } + } else { + /* error orig. code from binutils - in theory we do not need it */ + if (info->path == NULL) { info->alloc = p - dir + 1 + 256; info->path = xmalloc (info->alloc); info->len = 0; } - else - { + else { if (info->len + 1 + (p - dir) >= info->alloc) { info->alloc += p - dir + 256; @@ -657,9 +688,11 @@ } info->path[info->len++] = ':'; } - memcpy (info->path + info->len, dir, p - dir); - info->len += p - dir; - info->path[info->len] = '\0'; + memcpy (info->path + info->len, dir, p - dir); + info->len += p - dir; + info->path[info->len] = '\0'; + } + globfree (&result); } } while (! feof (f));