Fwd: ERRORS: kdebase.spec

Jakub Bogusz qboosh w pld-linux.org
Wto, 13 Sty 2004, 16:56:49 CET


On Tue, Jan 13, 2004 at 09:58:23AM +0100, Jakub Bogusz wrote:
> On Tue, Jan 13, 2004 at 09:29:28AM +0100, Jacek Konieczny wrote:
> > On Tue, Jan 13, 2004 at 12:29:09AM +0100, Jakub Bogusz wrote:
> > > Na tym etapie śledztwa podejrzewam problemy z obsługą powrotu z obsługi
> > > sygnałów - nie wiem na ile z winy glibc, a na ile rpm-a...
> > 
> > A co rpm robi w funkcji obsługujących sygnał? Jest cała masa rzeczy
> > których w signal-handlerze nie wolno robić, a czym się większość
> > programistów nie przejmuje. Może RPM sobie na zbyt dużo tam pozwala.
> 
> Raczej nie - już wiem skąd się bierze bzdurny adres powrotu - taki jest
> przekazywany do jądra jako restorer (w wywołaniu rt_sigaction) przez
> glibc w obsłudze sigaction(), a dokładniej wrapperze
> __syscall_rt_sigaction() (sysdeps/unix/sysv/linux/alpha/rt_sigaction.S).
> Coś tam się zmieniło od 2.3.2 i podejrzewam, że w tym jest jakiś błąd.
> Nie wiem jeszcze na czym polega i jak naprawić - coś jest skopane przy
> przeliczaniu relokacji i wychodzą bzdurne adresy powrotu, gdzieś
> wewnątrz funkcji, w rpm-ie akurat związanej z NLS...
> 
> Hm! Mam już pewne podejrzenia...
> Ale napiszę, jak sprawdzę.

Okazały się prawdziwe.
Fragment zmian w obliczaniu adresów wyglądał tak:

|         beq     a1, 0f
| -       ldl     t0, 8(a1)                               # sa_flags
| -       lda     a4, sigreturn-__syscall_rt_sigaction(pv)
| -       lda     t1, rt_sigreturn-__syscall_rt_sigaction(pv)
| -       and     t0, 0x00000040, t0                      # SA_SIGINFO
| +       ldl     t0, 8(a1)                       # sa_flags
| +       ldah    a4, sigreturn(gp)               !gprelhigh
| +       ldah    t1, rt_sigreturn(gp)            !gprelhigh
| +       lda     a4, sigreturn(a4)               !gprellow
| +       lda     t1, rt_sigreturn(a4)            !gprellow
                  ^^               ^^
| +       and     t0, 0x00000040, t0              # SA_SIGINFO
|         cmovne  t0, t1, a4

Za dużo kopiowania no i dla sygnałów rt był SEGV przy powrocie.


Jak widać po buildlogach rpm już działa.
Zdążyło się poinstalować z kilkanaście pakietów w dwóch wersjach naraz
(z powodu SEGV w trakcie uaktualniania) - było trochę ręcznego
odchlewiania.

A - i po raz kolejny było więcej roboty dlatego, że pakiety nie mają
zależności pilnujących tych samych release podpakietów z jednego speca
(w większości przypadków).


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl