From f5845e2bd56f4b74cea839e92ba99815f32420f6 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 13 Aug 2012 11:14:38 -0600 Subject: [PATCH] - Replace patch for 179072 with offical version from upstream. --- glibc-rh179072.patch | 215 +++++++++++++++++++++++++++++++++++++------ glibc.spec | 18 ++-- 2 files changed, 196 insertions(+), 37 deletions(-) diff --git a/glibc-rh179072.patch b/glibc-rh179072.patch index 0ce664c..2ae7d32 100644 --- a/glibc-rh179072.patch +++ b/glibc-rh179072.patch @@ -1,6 +1,32 @@ -diff -Nrup c/elf/dl-close.c d/elf/dl-close.c ---- c/elf/dl-close.c 2012-05-21 00:08:02.410897531 -0600 -+++ d/elf/dl-close.c 2012-05-21 00:08:40.874716006 -0600 +commit 815e6fa3e010628f77838abec18692cbfeb60809 +Author: Gary Benson +Date: Thu Jul 26 11:03:35 2012 +0100 + + Add SystemTap static probes to the runtime linker. [BZ #14298] + +2012-07-27 Gary Benson + + [BZ #14298] + * elf/rtld.c: Include . + (dl_main): Added static probes "init_start" and "init_complete". + * elf/dl-load.c: Include . + (lose): Take new parameter "nsid". + Added static probe "map_failed". + (_dl_map_object_from_fd): Pass namespace id to lose. + Added static probe "map_start". + (open_verify): Pass namespace id to lose. + * elf/dl-open.c: Include . + (dl_open_worker) Added static probes "map_complete", "reloc_start" + and "reloc_complete". + * elf/dl-close.c: Include . + (_dl_close_worker): Added static probes "unmap_start" and + "unmap_complete". + * elf/rtld-debugger-interface.txt: New file documenting the above. + +diff --git a/elf/dl-close.c b/elf/dl-close.c +index a250ea5..45b2187 100644 +--- a/elf/dl-close.c ++++ b/elf/dl-close.c @@ -31,6 +31,7 @@ #include #include @@ -13,7 +39,7 @@ diff -Nrup c/elf/dl-close.c d/elf/dl-close.c struct r_debug *r = _dl_debug_initialize (0, nsid); r->r_state = RT_DELETE; _dl_debug_state (); -+ LIBC_PROBE (rtld_unmap_start, 2, nsid, r); ++ LIBC_PROBE (unmap_start, 2, nsid, r); if (unload_global) { @@ -21,13 +47,14 @@ diff -Nrup c/elf/dl-close.c d/elf/dl-close.c /* Notify the debugger those objects are finalized and gone. */ r->r_state = RT_CONSISTENT; _dl_debug_state (); -+ LIBC_PROBE (rtld_unmap_complete, 2, nsid, r); ++ LIBC_PROBE (unmap_complete, 2, nsid, r); /* Recheck if we need to retry, release the lock. */ out: -diff -Nrup c/elf/dl-load.c d/elf/dl-load.c ---- c/elf/dl-load.c 2012-05-21 00:08:02.219898432 -0600 -+++ d/elf/dl-load.c 2012-05-21 00:08:40.876715997 -0600 +diff --git a/elf/dl-load.c b/elf/dl-load.c +index fe83f87..43e1269 100644 +--- a/elf/dl-load.c ++++ b/elf/dl-load.c @@ -35,6 +35,7 @@ #include #include @@ -36,7 +63,7 @@ diff -Nrup c/elf/dl-load.c d/elf/dl-load.c #include -@@ -880,7 +881,7 @@ _dl_init_paths (const char *llp) +@@ -882,7 +883,7 @@ _dl_init_paths (const char *llp) static void __attribute__ ((noreturn, noinline)) lose (int code, int fd, const char *name, char *realname, struct link_map *l, @@ -45,15 +72,15 @@ diff -Nrup c/elf/dl-load.c d/elf/dl-load.c { /* The file might already be closed. */ if (fd != -1) -@@ -894,6 +895,7 @@ lose (int code, int fd, const char *name +@@ -896,6 +897,7 @@ lose (int code, int fd, const char *name, char *realname, struct link_map *l, { r->r_state = RT_CONSISTENT; _dl_debug_state (); -+ LIBC_PROBE (rtld_map_complete, 2, nsid, r); ++ LIBC_PROBE (map_failed, 2, nsid, r); } _dl_signal_error (code, name, NULL, msg); -@@ -932,7 +934,7 @@ _dl_map_object_from_fd (const char *name +@@ -934,7 +936,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, errval = errno; call_lose: lose (errval, fd, name, realname, l, errstring, @@ -62,15 +89,15 @@ diff -Nrup c/elf/dl-load.c d/elf/dl-load.c } /* Look again to see if the real name matched another already loaded. */ -@@ -1039,6 +1041,7 @@ _dl_map_object_from_fd (const char *name +@@ -1041,6 +1043,7 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, linking has not been used before. */ r->r_state = RT_ADD; _dl_debug_state (); -+ LIBC_PROBE (rtld_map_start, 2, nsid, r); ++ LIBC_PROBE (map_start, 2, nsid, r); make_consistent = true; } else -@@ -1734,7 +1737,7 @@ open_verify (const char *name, struct fi +@@ -1736,7 +1739,7 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader, name = strdupa (realname); free (realname); } @@ -79,9 +106,10 @@ diff -Nrup c/elf/dl-load.c d/elf/dl-load.c } /* See whether the ELF header is what we expect. */ -diff -Nrup c/elf/dl-open.c d/elf/dl-open.c ---- c/elf/dl-open.c 2012-05-20 19:47:38.000000000 -0600 -+++ d/elf/dl-open.c 2012-05-21 00:11:29.229920776 -0600 +diff --git a/elf/dl-open.c b/elf/dl-open.c +index e2780a4..00781af 100644 +--- a/elf/dl-open.c ++++ b/elf/dl-open.c @@ -32,6 +32,7 @@ #include #include @@ -94,7 +122,7 @@ diff -Nrup c/elf/dl-open.c d/elf/dl-open.c struct r_debug *r = _dl_debug_initialize (0, args->nsid); r->r_state = RT_CONSISTENT; _dl_debug_state (); -+ LIBC_PROBE (rtld_map_complete, 2, args->nsid, r); ++ LIBC_PROBE (map_complete, 3, args->nsid, r, new); /* Print scope information. */ if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES, 0)) @@ -111,27 +139,156 @@ diff -Nrup c/elf/dl-open.c d/elf/dl-open.c + if (! relocation_in_progress) + { + /* Notify the debugger that relocations are about to happen. */ -+ LIBC_PROBE (rtld_reloc_start, 2, args->nsid, r); ++ LIBC_PROBE (reloc_start, 2, args->nsid, r); + relocation_in_progress = 1; + } + #ifdef SHARED if (__builtin_expect (GLRO(dl_profile) != NULL, 0)) { -@@ -544,6 +555,10 @@ cannot load any more object with static +@@ -544,6 +555,10 @@ cannot load any more object with static TLS")); } } + /* Notify the debugger all new objects have been relocated. */ + if (relocation_in_progress) -+ LIBC_PROBE (rtld_reloc_complete, 2, args->nsid, r); ++ LIBC_PROBE (reloc_complete, 3, args->nsid, r, new); + /* Run the initializer functions of new objects. */ _dl_init (new, args->argc, args->argv, args->env); -diff -Nrup c/elf/rtld.c d/elf/rtld.c ---- c/elf/rtld.c 2012-05-21 00:08:02.415897505 -0600 -+++ d/elf/rtld.c 2012-05-21 00:08:40.917715803 -0600 +diff --git a/elf/rtld-debugger-interface.txt b/elf/rtld-debugger-interface.txt +new file mode 100644 +index 0000000..61bc99e +--- /dev/null ++++ b/elf/rtld-debugger-interface.txt +@@ -0,0 +1,122 @@ ++Standard debugger interface ++=========================== ++ ++The run-time linker exposes a rendezvous structure to allow debuggers ++to interface with it. This structure, r_debug, is defined in link.h. ++If the executable's dynamic section has a DT_DEBUG element, the ++run-time linker sets that element's value to the address where this ++structure can be found. ++ ++The r_debug structure contains (amongst others) the following fields: ++ ++ struct link_map *r_map: ++ A linked list of loaded objects. ++ ++ enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state: ++ The current state of the r_map list. RT_CONSISTENT means that r_map ++ is not currently being modified and may safely be inspected. RT_ADD ++ means that an object is being added to r_map, and that the list is ++ not guaranteed to be consistent. Likewise RT_DELETE means that an ++ object is being removed from the list. ++ ++ ElfW(Addr) r_brk: ++ The address of a function internal to the run-time linker which is ++ called whenever r_state is changed. The debugger should set a ++ breakpoint at this address if it wants to notice mapping changes. ++ ++This protocol is widely supported, but somewhat limited in that it ++has no provision to provide access to multiple namespaces, and that ++the notifications (via r_brk) only refer to changes to r_map--the ++debugger is notified that a new object has been added, for instance, ++but there is no way for the debugger to discover whether any of the ++objects in the link-map have been relocated or not. ++ ++ ++Probe-based debugger interface ++============================== ++ ++Systemtap is a dynamic tracing/instrumenting tool available on Linux. ++Probes that are not fired at run time have close to zero overhead. ++glibc contains a number of probes that debuggers can set breakpoints ++on in order to notice certain events. ++ ++All rtld probes have the following arguments: ++ ++ arg1: Lmid_t lmid: ++ The link-map ID of the link-map list that the object was loaded ++ into. This will be LM_ID_BASE for the application's main link-map ++ list, or some other value for different namespaces. ++ ++ arg2: struct r_debug *r_debug: ++ A pointer to the r_debug structure containing the link-map list ++ that the object was loaded into. This will be the value stored in ++ DT_DEBUG for the application's main link-map list, or some other ++ value for different namespaces. ++ ++map_complete and reloc_complete may have the following additional ++argument: ++ ++ arg3: struct link_map *new: ++ A pointer which, if not NULL, points to the entry in the specified ++ r_debug structure's link-map list corresponding to the first new ++ object to have been mapped or relocated, with new->l_next pointing ++ to the link-map of the next new object to have been mapped or ++ relocated, and so on. Note that because `new' is an entry in a ++ larger list, new->l_prev (if not NULL) will point to what was the ++ last link-map in the link-map list prior to the new objects being ++ mapped or relocated. ++ ++The following probes are available: ++ ++ init_start: ++ This is called once, when the linker is about to fill in the main ++ r_debug structure at application startup. init_start always has ++ lmid set to LM_ID_BASE and r_debug set to the value stored in ++ DT_DEBUG. r_debug is not guaranteed to be consistent until ++ init_complete is fired. ++ ++ init_complete: ++ This is called once, when the linker has filled in the main ++ r_debug structure at application startup. init_complete always ++ has lmid set to LM_ID_BASE and r_debug set to the value stored ++ in DT_DEBUG. The r_debug structure is consistent and may be ++ inspected, and all objects in the link-map are guaranteed to ++ have been relocated. ++ ++ map_start: ++ The linker is about to map new objects into the specified ++ namespace. The namespace's r_debug structure is not guaranteed ++ to be consistent until a corresponding map_complete is fired. ++ ++ map_complete: ++ The linker has finished mapping new objects into the specified ++ namespace. The namespace's r_debug structure is consistent and ++ may be inspected, although objects in the namespace's link-map ++ are not guaranteed to have been relocated. ++ ++ map_failed: ++ The linker failed while attempting to map new objects into ++ the specified namespace. The namespace's r_debug structure ++ is consistent and may be inspected. ++ ++ reloc_start: ++ The linker is about to relocate all unrelocated objects in the ++ specified namespace. The namespace's r_debug structure is not ++ guaranteed to be consistent until a corresponding reloc_complete ++ is fired. ++ ++ reloc_complete: ++ The linker has relocated all objects in the specified namespace. ++ The namespace's r_debug structure is consistent and may be ++ inspected, and all objects in the namespace's link-map are ++ guaranteed to have been relocated. ++ ++ unmap_start: ++ The linker is about to remove objects from the specified ++ namespace. The namespace's r_debug structure is not guaranteed to ++ be consistent until a corresponding unmap_complete is fired. ++ ++ unmap_complete: ++ The linker has finished removing objects into the specified ++ namespace. The namespace's r_debug structure is consistent and ++ may be inspected. +diff --git a/elf/rtld.c b/elf/rtld.c +index 6bcf224..06c4220 100644 +--- a/elf/rtld.c ++++ b/elf/rtld.c @@ -39,6 +39,7 @@ #include #include @@ -140,19 +297,19 @@ diff -Nrup c/elf/rtld.c d/elf/rtld.c #include #include -@@ -1681,6 +1682,7 @@ ERROR: ld.so: object '%s' cannot be load +@@ -1683,6 +1684,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", /* We start adding objects. */ r->r_state = RT_ADD; _dl_debug_state (); -+ LIBC_PROBE (rtld_init_start, 2, LM_ID_BASE, r); ++ LIBC_PROBE (init_start, 2, LM_ID_BASE, r); /* Auditing checkpoint: we are ready to signal that the initial map is being constructed. */ -@@ -2398,6 +2400,7 @@ ERROR: ld.so: object '%s' cannot be load +@@ -2402,6 +2404,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", r = _dl_debug_initialize (0, LM_ID_BASE); r->r_state = RT_CONSISTENT; _dl_debug_state (); -+ LIBC_PROBE (rtld_init_complete, 2, LM_ID_BASE, r); ++ LIBC_PROBE (init_complete, 2, LM_ID_BASE, r); #ifndef MAP_COPY /* We must munmap() the cache file. */ diff --git a/glibc.spec b/glibc.spec index 751eb68..c3f7255 100644 --- a/glibc.spec +++ b/glibc.spec @@ -85,9 +85,6 @@ Patch0005: %{name}-rh825061.patch Patch0006: %{name}-arm-hardfloat-3.patch -# stap, needs to be sent upstream -Patch0007: %{name}-rh179072.patch - # Needs to be sent upstream Patch0008: %{name}-rh697421.patch @@ -97,9 +94,6 @@ Patch0009: %{name}-rh740682.patch # Needs to be sent upstream Patch0010: %{name}-rh657588.patch -# Needs to be sent upstream -Patch0011: %{name}-rh564528.patch - # stap, needs to be sent upstream Patch0012: %{name}-stap-libm.patch @@ -109,6 +103,8 @@ Patch0034: %{name}-rh841318.patch # # Patches from upstream # +Patch1007: %{name}-rh179072.patch + Patch1025: %{name}-rh789238.patch Patch1035: %{name}-rh845960.patch @@ -119,6 +115,9 @@ Patch1035: %{name}-rh845960.patch # Obviously we're not there right now, but that's the goal # +# http://sourceware.org/ml/libc-alpha/2012-08/msg00224.html +Patch2011: %{name}-rh564528.patch + Patch2013: %{name}-rh757881.patch # Upstream BZ 13013 @@ -391,11 +390,11 @@ rm -rf %{glibcportsdir} %patch0004 -p1 %patch0005 -p1 %patch0006 -p1 -%patch0007 -p1 +%patch1007 -p1 %patch0008 -p1 %patch0009 -p1 %patch0010 -p1 -%patch0011 -p1 +%patch2011 -p1 %patch0012 -p1 %patch2013 -p1 %patch2014 -p1 @@ -1302,6 +1301,9 @@ rm -f *.filelist* %endif %changelog +* Mon Aug 13 2012 Jeff Law - 2.16-9 + - Replace patch for 179072 with official version from upstream. + * Fri Aug 10 2012 Jeff Law - 2.16-8 - Replace patch for 789238 with official version from upstream.