Closed p5pRT closed 13 years ago
Platform : Solaris 10 Update 6 64-bit X86 with GCC 4.1.2
Greetings All\,
I have just tried to build perl5 from the git repo (faa13f98b5438d7d2712a2578895829787af9ff5) for Solaris with DTrace Support enabled. The build failed due to missing dependencies. It appears that the required object files are not yet built at the stage of the build where perldtrace.o is generated from perldtrace.d.
I tried adding dependencies to perldtrace.o to build the required objects before perldtrace.o\, but that was not successful (see below).
The second approach was simply to remove those object from the list of files passed to the 'dtrace -G' command. This approach works and all test harness pass :-)
Is it the absolute right way to do this? Honestly I can't be sure\, dtrace does NOT seem to modify any existing object files passed to it\, but take notice of the ELF CLASS of the objects passed to it\, saving us passing -32 or -64 explicitly.
The diff for your evaluation:
---8\<---
Regards, Peter Bray Sydney\, Australia
PS: Additionally\, the following may assist people trying to compile perl 5.12.0 on Solaris 10 with GCC 4.1.2 or possibly other versions of GCC. The generated header file\, perldtrace.h\, includes an #if _DTRACE_VERSION\, which is used to determine if DTrace is available and its major version number. It gets this via '#include \<unistd.h>'\, which gets the real definition from \<sys/feature_tests.h>. Unfortunately\, my version of GCC has a GCC 'fixincludes' generated version of \<sys/feature_tests.h> which misses that definition. (Probably because GCC was build on S10U3 and I'm now running S10U6). Regardless\, a successful compile with DTrace enabled did not produce any DTrace functionality. Adding -Accflags='-D_DTRACE_VERSION=1' to the Configure line is a temporary workaround (ok hack) which worked for me.
% git show
commit faa13f98b5438d7d2712a2578895829787af9ff5 Author: Jesse Vincent \jesse@​bestpractical\.com Date: Mon Mar 15 19:00:11 2010 +0000
[Deleted irrelevant info]
% PKGS_PREFIX=/pkgs/64-bit % PKGS_RELEASE=/pkgs/64-bit/release % ./Configure -des -Dcc=gcc -Dprefix=${PKGS_RELEASE}/perl-5.12.0-faa13f98b5438d7d2712a2578895829787af9ff5 -Dotherlibdirs=${PKGS_PREFIX}/lib/perl:/pkgs/lib/perl -Dlocincpth='${PKGS_PREFIX}/include' -Dloclibpth='${PKGS_PREFIX}/lib/amd64:${PKGS_PREFIX}/lib' -Doptimize='-g -O2' -Dperladmin='software@localhost' -Dcf_email='software@localhost' -Uinstallusrbinperl -Dusethreads -Duseshrplib -Dusedtrace
[Deleted irrelevant info]
% gmake
[Deleted irrelevant info]
/usr/sbin/dtrace -G -s perldtrace.d -o perldtrace.o op.o perl.o gv.o toke.o perly.o pad.o regcomp.o dump.o util.o mg.o reentr.o mro.o hv.o av.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o pp_sort.o dtrace: failed to link script perldtrace.d: failed to open op.o: No such file or directory gmake: *** [perldtrace.o] Error 1
[ Checking files via 'ls' ]
% nocorrect ls op.o perl.o gv.o toke.o perly.o pad.o regcomp.o dump.o util.o mg.o reentr.o mro.o hv.o av.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o pp_sort.o
op.o: No such file or directory perl.o: No such file or directory av.o gv.o numeric.o pp_ctl.o regcomp.o toke.o deb.o hv.o pad.o pp_hot.o regexec.o universal.o doio.o locale.o perlapi.o pp_pack.o run.o utf8.o doop.o mathoms.o perlio.o pp_sort.o scope.o util.o dump.o mg.o perly.o pp_sys.o sv.o globals.o mro.o pp.o reentr.o taint.o
[ The relevant sections of the Makefile ]
% ggrep -B 6 -A 1 ndt Makefile obj0 = op$(OBJ_EXT) perl$(OBJ_EXT) obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT) obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) $(DTRACE_O) ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS) obj = $(ndt_obj) $(DTRACE_O)
-- $(DTRACE_H): perldtrace.d $(DTRACE) -h -s perldtrace.d -o $(DTRACE_H)
mydtrace.h: $(DTRACE_H)
$(DTRACE_O): perldtrace.d $(DTRACE) -G -s perldtrace.d -o $(DTRACE_O) $(ndt_obj)
ATTEMPT 1: Make $(obj0) (ie op.o and perl.o) build before perldtrace.o
OLD: $(DTRACE_O): perldtrace.d NEW: $(DTRACE_O): perldtrace.d $(obj0)
`sh cflags "optimize='-g -O2'" op.o` -fPIC op.c CCCMD = gcc -DPERL_CORE -c -D_REENTRANT -DDEBUGGING -fno-strict-aliasing -pipe -fstack-protector -m64 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DPERL_USE_SAFE_PUTENV -g -O2 -Wall -W -Wextra -Wdeclaration-after-statement -Wendif-labels -Wc++-compat gmake: Circular lib/Config_git.pl \<- miniperl dependency dropped. LD_LIBRARY_PATH=/tmp/64-bit/perl5:/pkgs/64-bit/lib:/pkgs/64-bit/lib/amd64 ./miniperl -Ilib make_patchnum.pl /bin/sh: ./miniperl: not found gmake: *** [lib/Config_git.pl] Error 1
ATTEMPT 2: Remove $(obj0) from ndt_obj (previous changes reverted first)
OLD: ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS) OLD: obj = $(ndt_obj) $(DTRACE_O)
NEW: ndt_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) NEW: obj = $(obj0) $(ndt_obj) $(DTRACE_O)
% gmake distclean % vi Makefile.SH # See Above % # Run 'Configure' as above % gmake # Completes successfully % gmake test # Completes successfully
pdb_ml@yahoo.com.au - Status changed from 'new' to 'open'
pdb_ml@yahoo.com.au - Status changed from 'open' to 'new'
I just ran into the same issue and checked that the proposed solution works. However\, it is not ideal because it breaks build if dtrace probes are ever added to perl.c and op.c in the future. In fact\, an example of such probes was already supplied by Sven Dowideit: http://fosiki.com/blog/2008/02/15/blead-perl-dtrace-probes/
A proper solution must take two factors into account: 1) when dtrace -G is first run\, it must work over perlmini.o and opmini.o\, as perl.o and op.o do not yet exist at that time (this problem is what the original poster's fix addresses) 2) a second pass of dtrace -G is also necessary because perl.o and op.o are apparently recreated before the main perl executable is built; during this second pass dtrace must work over perl.o and op.o rather than perlmini.o and opmini.o
If either (1) or (2) is ignored and one of perl.c or op.c contains dtrace probes\, then there will be complaints from the linker about undefined dtrace symbols (while building miniperl and/or building perl executable).
Unfortunately\, I'm not fluent enough with make to provide an elegant solution myself. Hopefully this will help put someone on the right track.
From: David Leadbeater \dgl@​dgl\.cx
As outlined in the RT ticket due to miniperl's dependencies differing to the final perl binary dtrace -G needs to be called separately for each.
Build tested on Mac OS X 10.6\, Solaris 11 and Scientific Linux with SystemTap from git.
(Solaris is the only system I have access to where DTRACE_O actually gets defined. Neither the dtrace binary on OS X nor SystemTap's dtrace compatibility layer accept the -G option.)
Makefile.SH | 13 ++++++++++--- 1 files changed\, 10 insertions(+)\, 3 deletions(-)
The RT System itself - Status changed from 'new' to 'open'
Seems my previous attempt didn't get Cc'd to p5p correctly.
On Tue Dec 21 16:58:13 2010\, dgl wrote:
From: David Leadbeater \dgl@​dgl\.cx
As outlined in the RT ticket due to miniperl's dependencies differing to the final perl binary dtrace -G needs to be called separately for each.
Build tested on Mac OS X 10.6\, Solaris 11 and Scientific Linux with SystemTap from git.
(Solaris is the only system I have access to where DTRACE_O actually gets defined. Neither the dtrace binary on OS X nor SystemTap's dtrace compatibility layer accept the -G option.) --- Makefile.SH | 13 ++++++++++--- 1 files changed\, 10 insertions(+)\, 3 deletions(-)
diff --git a/Makefile.SH b/Makefile.SH index 9d8df27..a34416a 100755 --- a/Makefile.SH +++ b/Makefile.SH @@ -215\,11 +215\,13 @@ done
dtrace_h='' dtrace_o='' +minidtrace_o='' case "$usedtrace" in define|true) dtrace_h='perldtrace.h' $dtrace -G -s perldtrace.d -o perldtrace.tmp >/dev/null 2>&1 \ - && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' + && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' \ + && minidtrace_o='miniperldtrace$(OBJ_EXT)' ;; esac
@@ -332\,6 +334\,7 @@ VALGRIND=valgrind DTRACE = $dtrace DTRACE_H = $dtrace_h DTRACE_O = $dtrace_o +MINIDTRACE_O = $minidtrace_o
FIRSTMAKEFILE = $firstmakefile
@@ -454\,7 +457\,8 @@ obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$ obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
-mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) $(DTRACE_O) +minindt_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) +mini_obj = $(minindt_obj) $(MINIDTRACE_O) ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS) obj = $(ndt_obj) $(DTRACE_O)
@@ -742\,9 +746\,12 @@ mydtrace.h: $(DTRACE_H) case "$dtrace_o" in ?*) $spitshell >>$Makefile \<\<'!NO!SUBS!' -$(DTRACE_O): perldtrace.d +$(DTRACE_O): perldtrace.d $(ndt_obj) $(DTRACE) -G -s perldtrace.d -o $(DTRACE_O) $(ndt_obj)
+$(MINIDTRACE_O): perldtrace.d $(minindt_obj) + $(DTRACE) -G -s perldtrace.d -o $(MINIDTRACE_O) $(minindt_obj) + !NO!SUBS! ;; esac
On Tue Dec 21 16:58:13 2010\, dgl wrote:
From: David Leadbeater \dgl@​dgl\.cx
As outlined in the RT ticket due to miniperl's dependencies differing to the final perl binary dtrace -G needs to be called separately for each.
Build tested on Mac OS X 10.6\, Solaris 11 and Scientific Linux with SystemTap from git.
(Solaris is the only system I have access to where DTRACE_O actually gets defined. Neither the dtrace binary on OS X nor SystemTap's dtrace compatibility layer accept the -G option.) --- Makefile.SH | 13 ++++++++++--- 1 files changed\, 10 insertions(+)\, 3 deletions(-)
diff --git a/Makefile.SH b/Makefile.SH index 9d8df27..a34416a 100755 --- a/Makefile.SH +++ b/Makefile.SH @@ -215\,11 +215\,13 @@ done
dtrace_h='' dtrace_o='' +minidtrace_o='' case "$usedtrace" in define|true) dtrace_h='perldtrace.h' $dtrace -G -s perldtrace.d -o perldtrace.tmp >/dev/null 2>&1 \ - && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' + && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' \ + && minidtrace_o='miniperldtrace$(OBJ_EXT)' ;; esac
@@ -332\,6 +334\,7 @@ VALGRIND=valgrind DTRACE = $dtrace DTRACE_H = $dtrace_h DTRACE_O = $dtrace_o +MINIDTRACE_O = $minidtrace_o
FIRSTMAKEFILE = $firstmakefile
@@ -454\,7 +457\,8 @@ obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$ obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
-mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) $(DTRACE_O) +minindt_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) +mini_obj = $(minindt_obj) $(MINIDTRACE_O) ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS) obj = $(ndt_obj) $(DTRACE_O)
@@ -742\,9 +746\,12 @@ mydtrace.h: $(DTRACE_H) case "$dtrace_o" in ?*) $spitshell >>$Makefile \<\<'!NO!SUBS!' -$(DTRACE_O): perldtrace.d +$(DTRACE_O): perldtrace.d $(ndt_obj) $(DTRACE) -G -s perldtrace.d -o $(DTRACE_O) $(ndt_obj)
+$(MINIDTRACE_O): perldtrace.d $(minindt_obj) + $(DTRACE) -G -s perldtrace.d -o $(MINIDTRACE_O) $(minindt_obj) + !NO!SUBS! ;; esac
Thank you. Applied as 3d450a5.
On Tue Dec 21 16:58:13 2010\, dgl wrote:
From: David Leadbeater \dgl@​dgl\.cx
As outlined in the RT ticket due to miniperl's dependencies differing to the final perl binary dtrace -G needs to be called separately for each.
Build tested on Mac OS X 10.6\, Solaris 11 and Scientific Linux with SystemTap from git.
(Solaris is the only system I have access to where DTRACE_O actually gets defined. Neither the dtrace binary on OS X nor SystemTap's dtrace compatibility layer accept the -G option.) --- Makefile.SH | 13 ++++++++++--- 1 files changed\, 10 insertions(+)\, 3 deletions(-)
diff --git a/Makefile.SH b/Makefile.SH index 9d8df27..a34416a 100755 --- a/Makefile.SH +++ b/Makefile.SH @@ -215\,11 +215\,13 @@ done
dtrace_h='' dtrace_o='' +minidtrace_o='' case "$usedtrace" in define|true) dtrace_h='perldtrace.h' $dtrace -G -s perldtrace.d -o perldtrace.tmp >/dev/null 2>&1 \ - && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' + && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' \ + && minidtrace_o='miniperldtrace$(OBJ_EXT)' ;; esac
@@ -332\,6 +334\,7 @@ VALGRIND=valgrind DTRACE = $dtrace DTRACE_H = $dtrace_h DTRACE_O = $dtrace_o +MINIDTRACE_O = $minidtrace_o
FIRSTMAKEFILE = $firstmakefile
@@ -454\,7 +457\,8 @@ obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$ obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT) obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
-mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) $(DTRACE_O) +minindt_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) +mini_obj = $(minindt_obj) $(MINIDTRACE_O) ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS) obj = $(ndt_obj) $(DTRACE_O)
@@ -742\,9 +746\,12 @@ mydtrace.h: $(DTRACE_H) case "$dtrace_o" in ?*) $spitshell >>$Makefile \<\<'!NO!SUBS!' -$(DTRACE_O): perldtrace.d +$(DTRACE_O): perldtrace.d $(ndt_obj) $(DTRACE) -G -s perldtrace.d -o $(DTRACE_O) $(ndt_obj)
+$(MINIDTRACE_O): perldtrace.d $(minindt_obj) + $(DTRACE) -G -s perldtrace.d -o $(MINIDTRACE_O) $(minindt_obj) + !NO!SUBS! ;; esac
Thank you. Applied as 3d450a5.
@cpansprout - Status changed from 'open' to 'resolved'
* Father Chrysostomos via RT \perlbug\-comment@​perl\.org [2011-01-02T17:50:49]
On Tue Dec 21 16:58:13 2010\, dgl wrote:
From: David Leadbeater \dgl@​dgl\.cx
As outlined in the RT ticket due to miniperl's dependencies differing to the final perl binary dtrace -G needs to be called separately for each. [ ... ]
Thank you. Applied as 3d450a5.
This has two votes to cherry-pick\, one of them mine. With this commit\, I can compile -Dusedtrace on Solaris and all tests pass. Without this commit\, I cannot. If a third could please review and vote on this\, it would make possible the use of a dtrace-enabled Perl on Solaris\, which would be a great fix.
-- rjbs
* Ricardo Signes \perl\.p5p@​rjbs\.manxome\.org [2011-01-04T10:18:51]
This has two votes to cherry-pick\, one of them mine. With this commit\, I can compile -Dusedtrace on Solaris and all tests pass. Without this commit\, I cannot. If a third could please review and vote on this\, it would make possible the use of a dtrace-enabled Perl on Solaris\, which would be a great fix.
Thanks\, applied as 05571b730
-- rjbs
As the original reporter I can also verify the committed patch "WORKS FOR ME". Sorry for the delay in testing (I've been unwell).
Test Platform Updated to Solaris 10 Update 9 64-bit X86 with GCC 4.1.2
Migrated from rt.perl.org#73630 (status was 'resolved')
Searchable as RT73630$