- Replace patch for 179072 with offical version from upstream.

This commit is contained in:
Jeff Law 2012-08-13 11:14:38 -06:00
parent 49bbcdd4a0
commit f5845e2bd5
2 changed files with 196 additions and 37 deletions

View File

@ -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 <gbenson@redhat.com>
Date: Thu Jul 26 11:03:35 2012 +0100
Add SystemTap static probes to the runtime linker. [BZ #14298]
2012-07-27 Gary Benson <gbenson@redhat.com>
[BZ #14298]
* elf/rtld.c: Include <stap-probe.h>.
(dl_main): Added static probes "init_start" and "init_complete".
* elf/dl-load.c: Include <stap-probe.h>.
(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 <stap-probe.h>.
(dl_open_worker) Added static probes "map_complete", "reloc_start"
and "reloc_complete".
* elf/dl-close.c: Include <stap-probe.h>.
(_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 <sys/mman.h>
#include <sysdep-cancel.h>
@ -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 <stackinfo.h>
#include <caller.h>
@ -36,7 +63,7 @@ diff -Nrup c/elf/dl-load.c d/elf/dl-load.c
#include <dl-dst.h>
@@ -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 <caller.h>
#include <sysdep-cancel.h>
@ -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 <dl-osinfo.h>
#include <dl-procinfo.h>
@ -140,19 +297,19 @@ diff -Nrup c/elf/rtld.c d/elf/rtld.c
#include <stackinfo.h>
#include <assert.h>
@@ -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. */

View File

@ -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 <law@redhat.com> - 2.16-9
- Replace patch for 179072 with official version from upstream.
* Fri Aug 10 2012 Jeff Law <law@redhat.com> - 2.16-8
- Replace patch for 789238 with official version from upstream.