bug-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Segafult while running make(1) from /lib/init/rc with -j


From: Alejandro Colomar (man-pages)
Subject: Re: Segafult while running make(1) from /lib/init/rc with -j
Date: Sat, 8 Jan 2022 21:37:25 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.4.1

Hi Dmitry,

On 1/7/22 17:48, Dmitry Goncharov wrote:
On Thu, Jan 6, 2022 at 2:13 PM Alejandro Colomar (man-pages)
<alx.manpages@gmail.com> wrote:
  I could try to write a simpler Makefile

That would be good. We need to be able to reproduce the crash.

I couldn't reproduce it with a simple Makefile with a few includes and a few sleeps.

Would you mind if I send you the script with which I generated the Makefiles, and you run it in a virtual machine?

I run it on a Devuan install with sysvinit.

The steps are:

$ sudo mkdir /etc/rc.mk.d/
$ sudo ./script_insserv.sh
$ sudo cp ./Makefile /etc/rc.mk.d/Makefile
$ sudo sed -i 's/startup stop$/echo foo/'
$ sudo sed -i 's,startup [^ ]$,make -C "/etc/rc.mk.d/" "$runlevel" -j 2'

It's easier if you have 2 systems on the same virtual machine to be able to boot from the other ones.


I'll copy the script and the Makefile here, but maybe the mailer breaks it. If so, I can send it through git-send-email(1).


Thanks,

Alex

---


$ cat script_insserv.sh
#!/bin/bash

tmpd="$(mktemp -d)";


# Add a prefix or suffix "$1" to each Word (in the vi sense of a Word)
function prefix_Words()
{
        sed 's/^ *//' \
        |sed 's/ *$//' \
        |sed "s/  */ $1/g" \
        |sed "s/^\(.\)/$1\1/";
}

function suffix_Words()
{
        sed 's/^ *//' \
        |sed 's/ *$//' \
        |sed "s/  */$1 /g" \
        |sed "s/\(.\)$/\1$1/";
}


# Copy LSB info into a temp dir.  Slightly reformat it regarding whitespace.
find /etc/init.d/ -maxdepth 1 -not -type d \
|while read F; do
        grep '^### BEGIN INIT INFO *$' <$F >/dev/null \
        && grep '^### END INIT INFO *$' <$F >/dev/null \
        || continue;

        f="$tmpd/$(basename $F)";

        # It will be useful to have 1 trailing whitespace
        <$F \
        sed -n '/^### BEGIN INIT INFO *$/,/^### END INIT INFO *$/p' \
        |sed 's/ *$/ /' \
        >$f;
done;


function test_service_exists()
{
        find $tmpd -not -type d \
        |xargs cat \
        |grep "# Provides: $1 " >/dev/null;
}


function resolv_insservconf()
{
        test '$all' = "$1" \
        && echo '$all' \
        && return 0;

        find /etc/insserv.conf /etc/insserv.conf.d/ -not -type d \
        |xargs grep "^$1   " \
        |sed "s/^$1//" \
        |xargs -x -n1 echo \
        |while read val; do
                echo $val \
                |grep '^\$' >/dev/null \
                && resolv_insservconf $val \
                || echo $val;
        done \
        |xargs -x -n1 echo \
        |while read val;do
                echo $val \
                |grep '^+' >/dev/null \
                && ! test_service_exists $(echo $val | sed 's/^+//') \
                || echo $val;
        done \
        |xargs echo;

        return 0;
}


# Resolve variable dependencies (except for $all, which is special).
find $tmpd -not -type d \
|xargs cat \
|grep -o '\$[^ ]*' \
|sort \
|uniq \
|while read x; do \
        val="$(resolv_insservconf $x)";

        find $tmpd -not -type d \
        |xargs sed -i "s/ $x/ $val/g";
done;


# Remove optional deps that aren't found.  Otherwise, make(1) would fail.
find $tmpd -not -type d \
|xargs cat \
|grep -e '# Should-Start:' -e '# Should-Stop:' \
|sed 's/.*://' \
|xargs -n1 echo \
|sort \
|uniq \
|while read x; do \
        test '$all' = "$x" \
        || test_service_exists $x \
        && continue;

        find $tmpd -not -type d \
        |xargs sed -i "/# Should-Start:.* $x .*/s/ $x / /";

        find $tmpd -not -type d \
        |xargs sed -i "/# Should-Stop:.* $x .*/s/ $x / /";
done;


# XXX We can't use that info with current make(1).  Discard it.
# Maybe someone knows how to fix this.
find $tmpd -not -type d \
|while read f; do \
        sed -i '/# X-Interactive:/d' $f;
done;


# And finally, write the to-be-included makefile.
find $tmpd -not -type d \
|while read f; do \
        p="$(<$f grep '# Provides:' | sed 's/.*://')";
        kp="$(echo $p | prefix_Words 'k')";
        sp="$(echo $p | prefix_Words 's')";
        Kf="K$(basename $f)";
        Sf="S$(basename $f)";

        allS="$(<$f grep '# Required-Start:.* $all ' >/dev/null && echo all)";
        allK="$(<$f grep '# Required-Stop:.* $all ' >/dev/null && echo all)";
        sed -i 's/ $all//' $f;

        mk="/etc/rc.mk.d/$(basename $f).mk";

        echo ".PHONY: $kp $sp $Kf $Sf" >$mk;

        <$f \
        grep -e '# Required-Start:' -e '# Should-Start:' \
        |sed 's/.*://' \
        |xargs echo \
        |prefix_Words 's' \
        |while read sdeps; do \
                echo "$Sf: $sdeps";
        done \
        >>$mk;

        <$f \
        grep '# X-Start-Before:' \
        |sed 's/.*://' \
        |prefix_Words 's' \
        |while read srdeps; do \
                echo "$srdeps: $sp";
        done \
        >>$mk;

        <$f \
        grep -e '# Required-Stop:' -e '# Should-Stop:' \
        |sed 's/.*://' \
        |xargs echo \
        |prefix_Words 'k' \
        |while read krdeps; do \
                echo "$krdeps: $kp";
        done \
        >>$mk;

        <$f \
        grep '# X-Stop-After:' \
        |sed 's/.*://' \
        |prefix_Words 'k' \
        |while read kdeps; do \
                echo "$Kf: $kdeps";
        done \
        >>$mk;

        <$f \
        grep '# Default-Start:' \
        |sed 's/.*://' \
        |suffix_Words "s$allS" \
        |while read ns; do \
                echo "$ns: $sp";
        done \
        >>$mk;

        <$f \
        grep '# Default-Stop:' \
        |sed 's/.*://' \
        |suffix_Words "k$allK" \
        |while read nk; do \
                echo "$nk: $kp";
        done \
        >>$mk;

        sed -i '/: *$/d' $mk;
        sed -i '/^ *:/d' $mk;

        >>$mk cat <<EOF
$kp: $Kf
$sp: $Sf

$Kf:
        /etc/init.d/$(basename $f) stop

$Sf:
        /etc/init.d/$(basename $f) start
EOF
done;


$ cat Makefile
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
MAKEFLAGS += --output-sync=target

.PHONY: all
.PHONY: 0     1     2     3     4     5     6     S
.PHONY: 0k    1k    2k    3k    4k    5k    6k    Sk
.PHONY: 0kall 1kall 2kall 3kall 4kall 5kall 6kall Skall
.PHONY: 0s    1s    2s    3s    4s    5s    6s    Ss
.PHONY: 0sall 1sall 2sall 3sall 4sall 5sall 6sall Ssall

all: 5

0:
        $(MAKE) 0kall
        $(MAKE) 0k
        $(MAKE) 0s
        $(MAKE) 0sall
0kall 0k 0s 0sall:

1:
        $(MAKE) 1kall
        $(MAKE) 1k
        $(MAKE) 1s
        $(MAKE) 1sall
1kall 1k 1s 1sall:

2:
        $(MAKE) 2kall
        $(MAKE) 2k
        $(MAKE) 2s
        $(MAKE) 2sall
2kall 2k 2s 2sall:

3:
        $(MAKE) 3kall
        $(MAKE) 3k
        $(MAKE) 3s
        $(MAKE) 3sall
3kall 3k 3s 3sall:

4:
        $(MAKE) 4kall
        $(MAKE) 4k
        $(MAKE) 4s
        $(MAKE) 4sall
4kall 4k 4s 4sall:

5:
        $(MAKE) 5kall
        $(MAKE) 5k
        $(MAKE) 5s
        $(MAKE) 5sall
5kall 5k 5s 5sall:

6:
        $(MAKE) 6kall
        $(MAKE) 6k
        $(MAKE) 6s
        $(MAKE) 6sall
6kall 6k 6s 6sall:

S:
        $(MAKE) Skall
        $(MAKE) Sk
        $(MAKE) Ss
        $(MAKE) Ssall
Skall Sk Ss Ssall:

include /etc/rc.mk.d/*.mk



--
Alejandro Colomar
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
http://www.alejandro-colomar.es/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]