Bir işlevin yanlış sürümünün bir segfault nedeninin çağrıldığı bir sorunu ayıklamaya çalışıyorum. Derlediğim kod, makine tarafından üretilir ve bir karmaşıkın iki argümanını çoğaltan 'zamanlar' adlı bir işlev içerir. Bu kod, daha yüksek düzeyli bir nesne dosyasına bağlanmadan önce bir .o'ya derlenir.C programın yanlış sürümüne program bağlantıları
Bu kod çalıştırıldığında segfaults ve gdb, glibc'nin 'times' sürümünde olduğunu ve bu bile aynı sayıda argümanı almadığını belirtir. Bu kodun herhangi bir yerinde #include bulunmaz.
Zamanların ismini defa1 olarak değiştirmek sorunu çözer. Bu, kodun makine tarafından oluşturulmuş yapısı nedeniyle ve bu fonksiyonun adını her zaman elden bırakmadan dolayı uzun süreli bir çözüm değildir.
Tüm pislik -Wall ile temizlik derler, bu yüzden nereye bakacağımı bilmiyorum. Bunu nasıl çözeceğiniz konusunda bir fikrin var mı?
Compile chain:
gcc -Wall -I. -g --shared -o dpd.o -fPIC *.c (mahine generated code here)
gcc -g --std=c99 -c -fpic getData.c -I/usr/local/include -L/usr/local/lib -lmatio -I/usr/local/include/iverilog -I$(MATLAB)
gcc -g -shared -o getData.vpi getData.o $(MATLAB)/dpd.o -lvpi -lmatio -L/usr/local/lib
Birden çok C dosyasını tek bir '.o'ya derlemek geleneksel değildir. Times.c, bu grupta derlenen birkaç C dosyasından biri ise, sorunu açıklayabilir. – Gene
'# include' yalnızca bildirimlerde bulunur; Bağlantının kontrolü yoktur. 'Times' adında bir işlev bildirir ve sonra onu çağırırsanız, derleyici, sembol tablosunda bu ada sahip bir başvuru içeren bir nesne dosyası üretecek ve daha sonra linker, son yürütülebilir dosyayı üretirken bu adın bir tanımını arayacaktır. . Libc'de 'times' işlevi var ve linker bu şekilde bulundu. – Wyzard
Gene - Yorumunuzu detaylandırır mısınız? times.c gerçekten bu tek nesneye derlenmiş ayrı bir C dosyasıdır. Neden bunun bir soruna yol açmasını bekliyorsun? Gerçekten bunun için ilgilendiğim tek bir giriş noktası var .o ve 'zamanlar' bunlardan biri değil. yani tamamen içsel olmalı ve daha yüksek katmanlara dinamik bir sembol olarak görülmemelidir. Bu konuda gcc söylemenin bir yolu var mı? –