[81469] trunk/dports/devel/valgrind

raimue at macports.org raimue at macports.org
Sun Jul 31 03:37:58 PDT 2011


Revision: 81469
          http://trac.macports.org/changeset/81469
Author:   raimue at macports.org
Date:     2011-07-31 03:37:54 -0700 (Sun, 31 Jul 2011)
Log Message:
-----------
devel/valgrind:
Updated compatibility patch for Xcode 4 and above, initial patch was faulty.

Modified Paths:
--------------
    trunk/dports/devel/valgrind/Portfile
    trunk/dports/devel/valgrind/files/patch-xcode4.diff

Modified: trunk/dports/devel/valgrind/Portfile
===================================================================
--- trunk/dports/devel/valgrind/Portfile	2011-07-31 10:00:17 UTC (rev 81468)
+++ trunk/dports/devel/valgrind/Portfile	2011-07-31 10:37:54 UTC (rev 81469)
@@ -5,7 +5,7 @@
 name            valgrind
 conflicts       valgrind-devel
 version         3.6.1
-revision        1
+revision        2
 categories      devel
 platforms       darwin
 maintainers     raimue
@@ -34,7 +34,11 @@
 # Ignore trace reports about boost, Qt and OpenMP
 # as they are only used for tests
 
-patchfiles      patch-xcode4.diff
+# Compatibility patch for Xcode 4 and above, #28572
+if {[rpm-vercomp $xcodeversion 4.0.0] > 0} {
+    patchfiles-append   patch-xcode4.diff
+    use_autoreconf yes
+}
 
 configure.args  --mandir=${prefix}/share/man \
                 --without-mpicc

Modified: trunk/dports/devel/valgrind/files/patch-xcode4.diff
===================================================================
--- trunk/dports/devel/valgrind/files/patch-xcode4.diff	2011-07-31 10:00:17 UTC (rev 81468)
+++ trunk/dports/devel/valgrind/files/patch-xcode4.diff	2011-07-31 10:37:54 UTC (rev 81469)
@@ -1,45 +1,4 @@
-Index: coregrind/link_tool_exe_darwin.in
-===================================================================
---- coregrind/link_tool_exe_darwin.in	(revision 11685)
-+++ coregrind/link_tool_exe_darwin.in	(revision 11686)
-@@ -160,14 +160,31 @@
-     }
- }
- 
--#print "link_tool_exe_darwin: $cmd\n";
--
-+print "link_tool_exe_darwin: $cmd\n";
- 
- # Execute the command:
- my $r = system("$cmd");
- 
--if ($r == 0) {
--    exit 0;
--} else {
--    exit 1;
-+if ($r != 0) {
-+   exit 1;
- }
-+
-+
-+# and now kludge the tool exe
-+# see bug 267997
-+
-+$cmd = "../coregrind/fixup_macho_loadcmds";
-+$cmd = "$cmd $stack_addr_str $stack_size_str $outname";
-+
-+print "link_tool_exe_darwin: $cmd\n";
-+
-+my $r = system("$cmd");
-+
-+if ($r != 0) {
-+   exit 1;
-+}
-+
-+
-+
-+
-+exit 0;
+http://github.com/mxcl/homebrew/commit/a8a0c3e56a7cea03e06f7b3c874af973704f6e3e#Library/Formula/valgrind.rb
 Index: coregrind/fixup_macho_loadcmds.c
 ===================================================================
 --- coregrind/fixup_macho_loadcmds.c	(revision 0)
@@ -291,7 +250,7 @@
 +   { struct fat_header*  fh_be;
 +     struct fat_header   fh;
 +     struct mach_header_64* mh;
-+     
++
 +     // Assume initially that we have a thin image, and update
 +     // these if it turns out to be fat.
 +     ii->macho_img     = ii->img;
@@ -314,7 +273,7 @@
 +                          + fh.nfat_arch * sizeof(struct fat_arch))
 +           fail("Invalid Mach-O file (1 too small).");
 +
-+        for (f = 0, arch_be = (struct fat_arch *)(fh_be+1); 
++        for (f = 0, arch_be = (struct fat_arch *)(fh_be+1);
 +             f < fh.nfat_arch;
 +             f++, arch_be++) {
 +           Int cputype;
@@ -600,7 +559,7 @@
 +
 +   if (argc != 4)
 +      fail("args: -stack_addr-arg -stack_size-arg "
-+           "name-of-tool-executable-to-modify"); 
++           "name-of-tool-executable-to-modify");
 +
 +   r= sscanf(argv[1], "0x%llx", &req_stack_addr);
 +   if (r != 1) fail("invalid stack_addr arg");
@@ -615,7 +574,7 @@
 +   if (!is_plausible_tool_exe_name(argv[3]))
 +      fail("implausible tool exe name -- not of the form *-{x86,amd64}-darwin");
 +
-+   fprintf(stderr, "fixup_macho_loadcmds: examining tool exe: %s\n", 
++   fprintf(stderr, "fixup_macho_loadcmds: examining tool exe: %s\n",
 +           argv[3] );
 +   modify_macho_loadcmds( argv[3], req_stack_addr - req_stack_size,
 +                          req_stack_size );
@@ -650,44 +609,21 @@
 +   nsects 0
 +    flags 0x0
 +*/
-Index: coregrind/Makefile.am
-===================================================================
---- coregrind/Makefile.am	(revision 11685)
-+++ coregrind/Makefile.am	(revision 11686)
-@@ -441,3 +441,18 @@
- 
- install-exec-local: install-noinst_PROGRAMS install-noinst_DSYMS
- 
-+#----------------------------------------------------------------------------
-+# Darwin linker kludges
-+#----------------------------------------------------------------------------
-+
-+if VGCONF_OS_IS_DARWIN
-+
-+BUILT_SOURCES += fixup_macho_loadcmds
-+fixup_macho_loadcmds: fixup_macho_loadcmds.c
-+	$(CC) -g -Wall -o fixup_macho_loadcmds fixup_macho_loadcmds.c
-+
-+CLEANFILES += fixup_macho_loadcmds
-+
-+endif
-+
-+EXTRA_DIST += fixup_macho_loadcmds.c
 Index: coregrind/link_tool_exe_darwin.in
 ===================================================================
 --- coregrind/link_tool_exe_darwin.in	(revision 11685)
-+++ coregrind/link_tool_exe_darwin.in	(revision 11686)
++++ coregrind/link_tool_exe_darwin.in	(working copy)
 @@ -160,14 +160,31 @@
      }
  }
- 
+
 -#print "link_tool_exe_darwin: $cmd\n";
--
 +print "link_tool_exe_darwin: $cmd\n";
- 
+
+-
  # Execute the command:
  my $r = system("$cmd");
- 
+
 -if ($r == 0) {
 -    exit 0;
 -} else {
@@ -715,624 +651,14 @@
 +
 +
 +exit 0;
-Index: coregrind/fixup_macho_loadcmds.c
-===================================================================
---- coregrind/fixup_macho_loadcmds.c	(revision 0)
-+++ coregrind/fixup_macho_loadcmds.c	(revision 11686)
-@@ -0,0 +1,605 @@
-+
-+/* Derived from Valgrind sources, coregrind/m_debuginfo/readmacho.c.
-+   GPL 2+ therefore.
-+
-+   Can be compiled as either a 32- or 64-bit program (doesn't matter).
-+*/
-+
-+/* What does this program do?  In short it postprocesses tool
-+   executables on MacOSX, after linking using /usr/bin/ld.  This is so
-+   as to work around a bug in the linker on Xcode 4.0.0 and Xcode
-+   4.0.1.  Xcode versions prior to 4.0.0 are unaffected.
-+
-+   The tracking bug is https://bugs.kde.org/show_bug.cgi?id=267997
-+
-+   The bug causes 64-bit tool executables to segfault at startup,
-+   because:
-+
-+   Comparing the MachO load commands vs a (working) tool executable
-+   that was created by Xcode 3.2.x, it appears that the new linker has
-+   partially ignored the build system's request to place the tool
-+   executable's stack at a non standard location.  The build system
-+   tells the linker "-stack_addr 0x134000000 -stack_size 0x800000".
-+
-+   With the Xcode 3.2 linker those flags produce two results:
-+
-+   (1) A load command to allocate the stack at the said location:
-+          Load command 3
-+                cmd LC_SEGMENT_64
-+            cmdsize 72
-+            segname __UNIXSTACK
-+             vmaddr 0x0000000133800000
-+             vmsize 0x0000000000800000
-+            fileoff 2285568
-+           filesize 0
-+            maxprot 0x00000007
-+           initprot 0x00000003
-+             nsects 0
-+              flags 0x0
-+
-+   (2) A request (in LC_UNIXTHREAD) to set %rsp to the correct value
-+       at process startup, 0x134000000.
-+
-+   With Xcode 4.0.1, (1) is missing but (2) is still present.  The
-+   tool executable therefore starts up with %rsp pointing to unmapped
-+   memory and faults almost instantly.
-+
-+   The workaround implemented by this program is documented in comment
-+   8 of bug 267997, viz:
-+
-+   One really sick workaround is to observe that the executables
-+   contain a redundant MachO load command:
-+
-+      Load command 2
-+            cmd LC_SEGMENT_64
-+        cmdsize 72
-+        segname __LINKEDIT
-+         vmaddr 0x0000000138dea000
-+         vmsize 0x00000000000ad000
-+        fileoff 2658304
-+       filesize 705632
-+        maxprot 0x00000007
-+       initprot 0x00000001
-+         nsects 0
-+          flags 0x0
-+
-+   The described section presumably contains information intended for
-+   the dynamic linker, but is irrelevant because this is a statically
-+   linked executable.  Hence it might be possible to postprocess the
-+   executables after linking, to overwrite this entry with the
-+   information that would have been in the missing __UNIXSTACK entry.
-+   I tried this by hand (with a binary editor) earlier and got
-+   something that worked.
-+*/
-+
-+#define DEBUGPRINTING 0
-+
-+#include <assert.h>
-+#include <stdlib.h>
-+#include <stdio.h>
-+#include <string.h>
-+#include <sys/mman.h>
-+#include <sys/stat.h>
-+#include <unistd.h>
-+#include <fcntl.h>
-+
-+
-+#undef PLAT_x86_darwin
-+#undef PLAT_amd64_darwin
-+
-+#if defined(__APPLE__) && defined(__i386__)
-+#  define PLAT_x86_darwin 1
-+#elif defined(__APPLE__) && defined(__x86_64__)
-+#  define PLAT_amd64_darwin 1
-+#else
-+#  error "Can't be compiled on this platform"
-+#endif
-+
-+#include <mach-o/loader.h>
-+#include <mach-o/nlist.h>
-+#include <mach-o/fat.h>
-+#include <mach/i386/thread_status.h>
-+
-+
-+typedef  unsigned char   UChar;
-+typedef    signed char   Char;
-+typedef           char   HChar; /* signfulness depends on host */
-+
-+typedef  unsigned int    UInt;
-+typedef    signed int    Int;
-+
-+typedef  unsigned char   Bool;
-+#define  True   ((Bool)1)
-+#define  False  ((Bool)0)
-+
-+typedef  unsigned long   UWord;
-+
-+typedef  UWord           SizeT;
-+typedef  UWord           Addr;
-+
-+typedef  unsigned long long int   ULong;
-+typedef    signed long long int   Long;
-+
-+
-+
-+__attribute__((noreturn))
-+void fail ( HChar* msg )
-+{
-+   fprintf(stderr, "fixup_macho_loadcmds: fail: %s\n", msg);
-+   exit(1);
-+}
-+
-+
-+/*------------------------------------------------------------*/
-+/*---                                                      ---*/
-+/*--- Mach-O file mapping/unmapping helpers                ---*/
-+/*---                                                      ---*/
-+/*------------------------------------------------------------*/
-+
-+typedef
-+   struct {
-+      /* These two describe the entire mapped-in ("primary") image,
-+         fat headers, kitchen sink, whatnot: the entire file.  The
-+         image is mapped into img[0 .. img_szB-1]. */
-+      UChar* img;
-+      SizeT  img_szB;
-+      /* These two describe the Mach-O object of interest, which is
-+         presumably somewhere inside the primary image.
-+         map_image_aboard() below, which generates this info, will
-+         carefully check that the macho_ fields denote a section of
-+         memory that falls entirely inside img[0 .. img_szB-1]. */
-+      UChar* macho_img;
-+      SizeT  macho_img_szB;
-+   }
-+   ImageInfo;
-+
-+
-+Bool is_macho_object_file( const void* buf, SizeT szB )
-+{
-+   /* (JRS: the Mach-O headers might not be in this mapped data,
-+      because we only mapped a page for this initial check,
-+      or at least not very much, and what's at the start of the file
-+      is in general a so-called fat header.  The Mach-O object we're
-+      interested in could be arbitrarily far along the image, and so
-+      we can't assume its header will fall within this page.) */
-+
-+   /* But we can say that either it's a fat object, in which case it
-+      begins with a fat header, or it's unadorned Mach-O, in which
-+      case it starts with a normal header.  At least do what checks we
-+      can to establish whether or not we're looking at something
-+      sane. */
-+
-+   const struct fat_header*  fh_be = buf;
-+   const struct mach_header_64* mh    = buf;
-+
-+   assert(buf);
-+   if (szB < sizeof(struct fat_header))
-+      return False;
-+   if (ntohl(fh_be->magic) == FAT_MAGIC)
-+      return True;
-+
-+   if (szB < sizeof(struct mach_header_64))
-+      return False;
-+   if (mh->magic == MH_MAGIC_64)
-+      return True;
-+
-+   return False;
-+}
-+
-+
-+/* Unmap an image mapped in by map_image_aboard. */
-+static void unmap_image ( /*MOD*/ImageInfo* ii )
-+{
-+   Int r;
-+   assert(ii->img);
-+   assert(ii->img_szB > 0);
-+   r = munmap( ii->img, ii->img_szB );
-+   /* Do we care if this fails?  I suppose so; it would indicate
-+      some fairly serious snafu with the mapping of the file. */
-+   assert( !r );
-+   memset(ii, 0, sizeof(*ii));
-+}
-+
-+
-+/* Map a given fat or thin object aboard, find the thin part if
-+   necessary, do some checks, and write details of both the fat and
-+   thin parts into *ii.  Returns 32 (and leaves the file unmapped) if
-+   the thin part is a 32 bit file.  Returns 64 if it's a 64 bit file.
-+   Does not return on failure.  Guarantees to return pointers to a
-+   valid(ish) Mach-O image if it succeeds. */
-+static Int map_image_aboard ( /*OUT*/ImageInfo* ii, HChar* filename )
-+{
-+   memset(ii, 0, sizeof(*ii));
-+
-+   /* First off, try to map the thing in. */
-+   { SizeT  size;
-+     Int r, fd;
-+     struct stat stat_buf;
-+
-+     r = stat(filename, &stat_buf);
-+     if (r)
-+        fail("Can't stat image (to determine its size)?!");
-+     size = stat_buf.st_size;
-+
-+     fd = open(filename, O_RDWR, 0);
-+     if (fd == -1)
-+        fail("Can't open image for possible modification!");
-+     if (DEBUGPRINTING)
-+        printf("size %lu fd %d\n", size, fd);
-+     void* v = mmap ( NULL, size, PROT_READ|PROT_WRITE,
-+                                  MAP_FILE|MAP_SHARED, fd, 0 );
-+     if (v == MAP_FAILED) {
-+        perror("mmap failed");
-+        fail("Can't mmap image for possible modification!");
-+     }
-+
-+     close(fd);
-+
-+     ii->img     = (UChar*)v;
-+     ii->img_szB = size;
-+   }
-+
-+   /* Now it's mapped in and we have .img and .img_szB set.  Look for
-+      the embedded Mach-O object.  If not findable, unmap and fail. */
-+   { struct fat_header*  fh_be;
-+     struct fat_header   fh;
-+     struct mach_header_64* mh;
-+     
-+     // Assume initially that we have a thin image, and update
-+     // these if it turns out to be fat.
-+     ii->macho_img     = ii->img;
-+     ii->macho_img_szB = ii->img_szB;
-+
-+     // Check for fat header.
-+     if (ii->img_szB < sizeof(struct fat_header))
-+        fail("Invalid Mach-O file (0 too small).");
-+
-+     // Fat header is always BIG-ENDIAN
-+     fh_be = (struct fat_header *)ii->img;
-+     fh.magic = ntohl(fh_be->magic);
-+     fh.nfat_arch = ntohl(fh_be->nfat_arch);
-+     if (fh.magic == FAT_MAGIC) {
-+        // Look for a good architecture.
-+        struct fat_arch *arch_be;
-+        struct fat_arch arch;
-+        Int f;
-+        if (ii->img_szB < sizeof(struct fat_header)
-+                          + fh.nfat_arch * sizeof(struct fat_arch))
-+           fail("Invalid Mach-O file (1 too small).");
-+
-+        for (f = 0, arch_be = (struct fat_arch *)(fh_be+1); 
-+             f < fh.nfat_arch;
-+             f++, arch_be++) {
-+           Int cputype;
-+#          if defined(PLAT_x86_darwin)
-+           cputype = CPU_TYPE_X86;
-+#          elif defined(PLAT_amd64_darwin)
-+           cputype = CPU_TYPE_X86_64;
-+#          else
-+#            error "unknown architecture"
-+#          endif
-+           arch.cputype    = ntohl(arch_be->cputype);
-+           arch.cpusubtype = ntohl(arch_be->cpusubtype);
-+           arch.offset     = ntohl(arch_be->offset);
-+           arch.size       = ntohl(arch_be->size);
-+           if (arch.cputype == cputype) {
-+              if (ii->img_szB < arch.offset + arch.size)
-+                 fail("Invalid Mach-O file (2 too small).");
-+              ii->macho_img     = ii->img + arch.offset;
-+              ii->macho_img_szB = arch.size;
-+              break;
-+           }
-+        }
-+        if (f == fh.nfat_arch)
-+           fail("No acceptable architecture found in fat file.");
-+     }
-+
-+     /* Sanity check what we found. */
-+
-+     /* assured by logic above */
-+     assert(ii->img_szB >= sizeof(struct fat_header));
-+
-+     if (ii->macho_img_szB < sizeof(struct mach_header_64))
-+        fail("Invalid Mach-O file (3 too small).");
-+
-+     if (ii->macho_img_szB > ii->img_szB)
-+        fail("Invalid Mach-O file (thin bigger than fat).");
-+
-+     if (ii->macho_img >= ii->img
-+         && ii->macho_img + ii->macho_img_szB <= ii->img + ii->img_szB) {
-+        /* thin entirely within fat, as expected */
-+     } else {
-+        fail("Invalid Mach-O file (thin not inside fat).");
-+     }
-+
-+     mh = (struct mach_header_64 *)ii->macho_img;
-+     if (mh->magic == MH_MAGIC) {
-+        assert(ii->img);
-+        assert(ii->macho_img);
-+        assert(ii->img_szB > 0);
-+        assert(ii->macho_img_szB > 0);
-+        assert(ii->macho_img >= ii->img);
-+        assert(ii->macho_img + ii->macho_img_szB <= ii->img + ii->img_szB);
-+        return 32;
-+     }
-+     if (mh->magic != MH_MAGIC_64)
-+        fail("Invalid Mach-O file (bad magic).");
-+
-+     if (ii->macho_img_szB < sizeof(struct mach_header_64) + mh->sizeofcmds)
-+        fail("Invalid Mach-O file (4 too small).");
-+   }
-+
-+   assert(ii->img);
-+   assert(ii->macho_img);
-+   assert(ii->img_szB > 0);
-+   assert(ii->macho_img_szB > 0);
-+   assert(ii->macho_img >= ii->img);
-+   assert(ii->macho_img + ii->macho_img_szB <= ii->img + ii->img_szB);
-+   return 64;
-+}
-+
-+
-+/*------------------------------------------------------------*/
-+/*---                                                      ---*/
-+/*--- Mach-O top-level processing                          ---*/
-+/*---                                                      ---*/
-+/*------------------------------------------------------------*/
-+
-+void modify_macho_loadcmds ( HChar* filename,
-+                             ULong  expected_stack_start,
-+                             ULong  expected_stack_size )
-+{
-+   ImageInfo ii;
-+   memset(&ii, 0, sizeof(ii));
-+
-+   Int size = map_image_aboard( &ii, filename );
-+   if (size == 32) {
-+      fprintf(stderr, "fixup_macho_loadcmds:   Is 32-bit MachO file;"
-+              " no modifications needed.\n");
-+      goto out;
-+   }
-+
-+   assert(size == 64);
-+
-+   assert(ii.macho_img != NULL && ii.macho_img_szB > 0);
-+
-+   /* Poke around in the Mach-O header, to find some important
-+      stuff.
-+      * the location of the __UNIXSTACK load command, if any
-+      * the location of the __LINKEDIT load command, if any
-+      * the initial RSP value as stated in the LC_UNIXTHREAD
-+   */
-+
-+   /* The collected data */
-+   ULong init_rsp = 0;
-+   Bool  have_rsp = False;
-+   struct segment_command_64* seg__unixstack = NULL;
-+   struct segment_command_64* seg__linkedit  = NULL;
-+
-+   /* Loop over the load commands and fill in the above 4 variables. */
-+
-+   { struct mach_header_64 *mh = (struct mach_header_64 *)ii.macho_img;
-+      struct load_command *cmd;
-+      Int c;
-+
-+      for (c = 0, cmd = (struct load_command *)(mh+1);
-+           c < mh->ncmds;
-+           c++, cmd = (struct load_command *)(cmd->cmdsize
-+                                              + (unsigned long)cmd)) {
-+         if (DEBUGPRINTING)
-+            printf("load cmd: offset %4lu   size %3d   kind %2d = ",
-+                   (unsigned long)((UChar*)cmd - (UChar*)ii.macho_img),
-+                   cmd->cmdsize, cmd->cmd);
-+
-+         switch (cmd->cmd) {
-+            case LC_SEGMENT_64:
-+               if (DEBUGPRINTING)
-+                  printf("LC_SEGMENT_64");
-+               break;
-+            case LC_SYMTAB:
-+               if (DEBUGPRINTING)
-+                  printf("LC_SYMTAB");
-+               break;
-+            case LC_UUID:
-+               if (DEBUGPRINTING)
-+                  printf("LC_UUID");
-+               break;
-+            case LC_UNIXTHREAD:
-+               if (DEBUGPRINTING)
-+                  printf("LC_UNIXTHREAD");
-+               break;
-+            default:
-+                  printf("???");
-+               fail("unexpected load command in Mach header");
-+            break;
-+         }
-+         if (DEBUGPRINTING)
-+            printf("\n");
-+
-+         /* Note what the stated initial RSP value is, so we can
-+            check it is as expected. */
-+         if (cmd->cmd == LC_UNIXTHREAD) {
-+            struct thread_command* tcmd = (struct thread_command*)cmd;
-+            UInt* w32s = (UInt*)( (UChar*)tcmd + sizeof(*tcmd) );
-+            if (DEBUGPRINTING)
-+               printf("UnixThread: flavor %u = ", w32s[0]);
-+            if (w32s[0] == x86_THREAD_STATE64 && !have_rsp) {
-+               if (DEBUGPRINTING)
-+                  printf("x86_THREAD_STATE64\n");
-+               x86_thread_state64_t* state64
-+                  = (x86_thread_state64_t*)(&w32s[2]);
-+               have_rsp = True;
-+               init_rsp = state64->__rsp;
-+               if (DEBUGPRINTING)
-+                  printf("rsp = 0x%llx\n", init_rsp);
-+            } else {
-+               if (DEBUGPRINTING)
-+                  printf("???");
-+            }
-+            if (DEBUGPRINTING)
-+               printf("\n");
-+         }
-+
-+         if (cmd->cmd == LC_SEGMENT_64) {
-+            struct segment_command_64 *seg = (struct segment_command_64 *)cmd;
-+            if (0 == strcmp(seg->segname, "__LINKEDIT"))
-+               seg__linkedit = seg;
-+            if (0 == strcmp(seg->segname, "__UNIXSTACK"))
-+               seg__unixstack = seg;
-+         }
-+
-+      }
-+   }
-+
-+   /*
-+      Actions are then as follows:
-+
-+      * (always) check the RSP value is as expected, and abort if not
-+
-+      * if there's a UNIXSTACK load command, check it is as expected.
-+        If not abort, if yes, do nothing more.
-+
-+      * (so there's no UNIXSTACK load command).  if there's a LINKEDIT
-+        load command, check if it is minimally usable (has 0 for
-+        nsects and flags).  If yes, convert it to a UNIXSTACK load
-+        command.  If there is none, or is unusable, then we're out of
-+        options and have to abort.
-+   */
-+   if (!have_rsp)
-+      fail("Can't find / check initial RSP setting");
-+   if (init_rsp != expected_stack_start + expected_stack_size)
-+      fail("Initial RSP value not as expected");
-+
-+   fprintf(stderr, "fixup_macho_loadcmds:   "
-+                   "initial RSP is as expected (0x%llx)\n",
-+                   expected_stack_start + expected_stack_size );
-+
-+   if (seg__unixstack) {
-+      struct segment_command_64 *seg = seg__unixstack;
-+      if (seg->vmaddr != expected_stack_start)
-+         fail("has __UNIXSTACK, but wrong ::vmaddr");
-+      if (seg->vmsize != expected_stack_size)
-+         fail("has __UNIXSTACK, but wrong ::vmsize");
-+      if (seg->maxprot != 7)
-+         fail("has __UNIXSTACK, but wrong ::maxprot (should be 7)");
-+      if (seg->initprot != 3)
-+         fail("has __UNIXSTACK, but wrong ::initprot (should be 3)");
-+      if (seg->nsects != 0)
-+         fail("has __UNIXSTACK, but wrong ::nsects (should be 0)");
-+      if (seg->flags != 0)
-+         fail("has __UNIXSTACK, but wrong ::flags (should be 0)");
-+      /* looks ok */
-+      fprintf(stderr, "fixup_macho_loadcmds:   "
-+              "acceptable __UNIXSTACK present; no modifications.\n" );
-+      goto out;
-+   }
-+
-+   if (seg__linkedit) {
-+      struct segment_command_64 *seg = seg__linkedit;
-+      if (seg->nsects != 0)
-+         fail("has __LINKEDIT, but wrong ::nsects (should be 0)");
-+      if (seg->flags != 0)
-+         fail("has __LINKEDIT, but wrong ::flags (should be 0)");
-+      fprintf(stderr, "fixup_macho_loadcmds:   "
-+              "no __UNIXSTACK present.\n" );
-+      fprintf(stderr, "fixup_macho_loadcmds:   "
-+              "converting __LINKEDIT to __UNIXSTACK.\n" );
-+      strcpy(seg->segname, "__UNIXSTACK");
-+      seg->vmaddr   = expected_stack_start;
-+      seg->vmsize   = expected_stack_size;
-+      seg->fileoff  = 0;
-+      seg->filesize = 0;
-+      seg->maxprot  = 7;
-+      seg->initprot = 3;
-+      /* success */
-+      goto out;
-+   }
-+
-+   /* out of options */
-+   fail("no __UNIXSTACK found and no usable __LINKEDIT found; "
-+        "out of options.");
-+   /* NOTREACHED */
-+
-+  out:
-+   if (ii.img)
-+      unmap_image(&ii);
-+}
-+
-+
-+static Bool is_plausible_tool_exe_name ( HChar* nm )
-+{
-+   HChar* p;
-+   if (!nm)
-+      return False;
-+
-+   // Does it end with this string?
-+   p = strstr(nm, "-x86-darwin");
-+   if (p && 0 == strcmp(p, "-x86-darwin"))
-+      return True;
-+
-+   p = strstr(nm, "-amd64-darwin");
-+   if (p && 0 == strcmp(p, "-amd64-darwin"))
-+      return True;
-+
-+   return False;
-+}
-+
-+
-+int main ( int argc, char** argv )
-+{
-+   Int   r;
-+   ULong req_stack_addr = 0;
-+   ULong req_stack_size = 0;
-+
-+   if (argc != 4)
-+      fail("args: -stack_addr-arg -stack_size-arg "
-+           "name-of-tool-executable-to-modify"); 
-+
-+   r= sscanf(argv[1], "0x%llx", &req_stack_addr);
-+   if (r != 1) fail("invalid stack_addr arg");
-+
-+   r= sscanf(argv[2], "0x%llx", &req_stack_size);
-+   if (r != 1) fail("invalid stack_size arg");
-+
-+   fprintf(stderr, "fixup_macho_loadcmds: "
-+           "requested stack_addr (top) 0x%llx, "
-+           "stack_size 0x%llx\n", req_stack_addr, req_stack_size );
-+
-+   if (!is_plausible_tool_exe_name(argv[3]))
-+      fail("implausible tool exe name -- not of the form *-{x86,amd64}-darwin");
-+
-+   fprintf(stderr, "fixup_macho_loadcmds: examining tool exe: %s\n", 
-+           argv[3] );
-+   modify_macho_loadcmds( argv[3], req_stack_addr - req_stack_size,
-+                          req_stack_size );
-+
-+   return 0;
-+}
-+
-+/*
-+      cmd LC_SEGMENT_64
-+  cmdsize 72
-+  segname __LINKEDIT
-+   vmaddr 0x0000000138dea000
-+   vmsize 0x00000000000ad000
-+  fileoff 2658304
-+ filesize 705632
-+  maxprot 0x00000007
-+ initprot 0x00000001
-+   nsects 0
-+    flags 0x0
-+*/
-+
-+/*
-+      cmd LC_SEGMENT_64
-+  cmdsize 72
-+  segname __UNIXSTACK
-+   vmaddr 0x0000000133800000
-+   vmsize 0x0000000000800000
-+  fileoff 2498560
-+ filesize 0
-+  maxprot 0x00000007
-+ initprot 0x00000003
-+   nsects 0
-+    flags 0x0
-+*/
 Index: coregrind/Makefile.am
 ===================================================================
 --- coregrind/Makefile.am	(revision 11685)
-+++ coregrind/Makefile.am	(revision 11686)
++++ coregrind/Makefile.am	(working copy)
 @@ -441,3 +441,18 @@
- 
+
  install-exec-local: install-noinst_PROGRAMS install-noinst_DSYMS
- 
+
 +#----------------------------------------------------------------------------
 +# Darwin linker kludges
 +#----------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20110731/90fb5528/attachment-0001.html>


More information about the macports-changes mailing list