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