Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -ru glibc-2.22/elf/dl-deps.c glibc-2.22-patched/elf/dl-deps.c
- --- glibc-2.22/elf/dl-deps.c 2015-08-05 09:42:21.000000000 +0300
- +++ glibc-2.22-patched/elf/dl-deps.c 2016-01-29 23:12:33.928386477 +0300
- @@ -152,6 +152,27 @@
- map->l_reserved = 1;
- }
- +/* Randomly shuffles first N elements of array A.
- + Element size is SIZE, initial seed is SEED. */
- +static void shuffle (void *a, unsigned n, size_t size, int seed)
- +{
- + char *aa = (char *)a;
- + uint32_t r = seed;
- + unsigned i;
- + for (i = 0; i < n; ++i)
- + {
- + unsigned j = r % n;
- + size_t k;
- + for (k = 0; k < size; ++k)
- + {
- + char tmp = aa[i * size + k];
- + aa[i * size + k] = aa[j * size + k];
- + aa[j * size + k] = tmp;
- + }
- + r = 1664525 * r + 1013904223; // LCG, "Numerical Recipes"
- + }
- +}
- +
- void
- internal_function
- _dl_map_object_deps (struct link_map *map,
- @@ -617,6 +638,7 @@
- i = 1;
- uint16_t seen[nlist];
- memset (seen, 0, nlist * sizeof (seen[0]));
- + shuffle (&l_initfini[1], nlist - 1, sizeof (l_initfini[0]), 0);
- while (1)
- {
- /* Keep track of which object we looked at this round. */
- diff -ru glibc-2.22/elf/dl-init.c glibc-2.22-patched/elf/dl-init.c
- --- glibc-2.22/elf/dl-init.c 2016-01-30 08:52:32.179810804 +0300
- +++ glibc-2.22-patched/elf/dl-init.c 2016-01-30 08:53:34.080995846 +0300
- @@ -24,6 +24,27 @@
- typedef void (*init_t) (int, char **, char **);
- +/* Randomly shuffles first N elements of array A.
- + Element size is SIZE, initial seed is SEED. */
- +static void shuffle (void *a, unsigned n, size_t size, int seed)
- +{
- + char *aa = (char *)a;
- + uint32_t r = seed;
- + unsigned i;
- + for (i = 0; i < n; ++i)
- + {
- + unsigned j = r % n;
- + size_t k;
- + for (k = 0; k < size; ++k)
- + {
- + char tmp = aa[i * size + k];
- + aa[i * size + k] = aa[j * size + k];
- + aa[j * size + k] = tmp;
- + }
- + r = 1664525 * r + 1013904223; // LCG, "Numerical Recipes"
- + }
- +}
- +
- static void
- call_init (struct link_map *l, int argc, char **argv, char **env)
- {
- @@ -67,13 +88,19 @@
- jm = l->l_info[DT_INIT_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr));
- + unsigned *r = malloc (jm * sizeof (unsigned));
- + for (j = 0; j < jm; ++j)
- + r[j] = j;
- + // First entry comes from crtstuff, don't mess with it...
- + shuffle (&r[1], jm - 1, sizeof (unsigned), 0);
- +
- addrs = (ElfW(Addr) *) (init_array->d_un.d_ptr + l->l_addr);
- for (j = 0; j < jm; ++j)
- {
- + _dl_debug_printf ("%s: calling init_array[%d] = %lx\n",
- + l->l_name ? l->l_name : "", r[j],
- + (unsigned long) addrs[r[j]] - (unsigned long) l->l_addr);
- + ((init_t) addrs[r[j]]) (argc, argv, env);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement