2010-05-04 6 views
5

hata Fedora Core 12 bir PHP uzantısı derlenmiş, ama birinin kullanarak CentOS göndermek zaman aldıkları bilgi: ELF 64 bit LSB paylaşılan nesne, AMD x86-64, sürüm 1 (GNU/Linux),Tüm dağıtımlarla paylaşmak için linux'u nasıl derlerim? "ELF dosyası OS ABI geçersiz"</p> <p>ne bu çalışan dosyayı neden aşağıdaki sağlar emin değilim:

ince yükleyen dosyadan aşağıdaki sağlayan bir uzantısı elimden değil: ELF 64 bit LSB paylaşılan nesne, AMD x86-64, sürüm 1 (SYSV), sıyrılmamış

Bazı dağıtımlar için bir GNU/LINUX yerine SYSV tipi bir dosya üretmem gerekiyor gibi görünüyor dosya, nasıl olsa fikir yok. Herhangi bir işaretçi?

Ayrıca statik olarak bağ kurmalı mıyım?

cevap

8

açıklamada: "ELF dosyası OS ABI geçersiz" (yani bir beklendiği gibi çalışmayabilir, hangi ev sahibi ve hedef ikilileri karıştırmak için çalışıyor) Application Binary Interface kullanılan ikili arasındaki uyumsuz olduğu anlamına gelir. ELF başlığının e_ident[EI_OSABI] baytında işletim sistemi/ABI kimliği bulunur. Arkadaşınızın CentOS sistemi ELFOSABI_SYSV (ELFOSABI_NONE veya 0) olarak ayarlanmışken, Fedora sisteminiz bunu ELFOSABI_LINUX (3) olarak ayarlıyor.

Sen FreeBSD brandelf programını (brandelf.c) derlemek ve ELFOSABI_SYSV (brandelf -f 0 <file> veya brandelf -t SVR4 <file> için OSABI ayarlamak için kullanmak mümkün olabilir.

Ben bu değeri belirtmek için herhangi gcc bayrakları farkında değilim/link derleme süresi. Ben senin Fedora sistemde gcc tarafından kullanılacağını binutils sürümü Linux OSABI belirlemekle sorumlu olduğuna inanıyoruz. Bu bir STT_GNU_IFUNC sembol çıkış dosyasına yer alırsa bağlayıcı sadece ABI belirten benim anlaşılmasıdır (STT_GNU_IFUNC ilgili ayrıntılar) için http://groups.google.com/group/generic-abi de ifunc.txt bkz.


readelf(1) komutELF başlığı (readelf -h <file>) saklanan ABI bilgileri almak ve görüntülemek için kullanılabilir. Ayrıca, bu similar question da ilginizi çekebilir. O aslında 64 bit çalışıyorsa

+0

Wow teşekkürler Tüm bilgiler için, markayı derleyebildim ve işletim sistemi başlığını değiştirebiliyordum. Değiştirilmiş ikili dosyayı gönderdim ve umarım işe yarayacak. STT_GNU_IFUNC sembolünden kurtulmanın bir yolunu bulmaya çalışacağım, nasıl yapacağımı bilmiyorum; basit bir şey gibi görünmüyor. –

+0

Kaynak kodunuzu "attribute ((ifunc))' için arama yapmayı deneyebilirsiniz. Ben * statik üzerinde 'ELFOSABI_LINUX' için' ELFOSABI_SYSV' dan OSABI değiştirmek başardı * Linux (ifunc özniteliği ile C++ programının) prog.C ait/ia32 ikili şu siteden indirilen ve halen hiç fark yan etkileri olmadan çalıştırmak. Bu ikili, statik olarak bağlantılıdır; bu, * yan etkilerin eksikliğini açıklayabilir. - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40528 – jschmier

-1

Büyük olasılıkla arkadaşınızın 64 bitlik bir sistem çalıştırmamasıdır. ELF, Linux çalıştırılabilirleri için standart biçimdir, ancak 32 bit sistemler 64 bit çalıştırılamıyor.

uname -a için çıktıyı arkadaşınızdan alın. Çıkış "x86_64" içermiyorsa, o zaman CentOS'un 32 bitlik bir sürümünde. Eğer öyleyse, ya çapraz derleme ortamı ya da 32-bit ikili dosyaları derlemek için bir sanal makine kurmanız ya da arkadaşınızı kendisinin derlemesi için kaynaklara sağlamanız gerekir.

+0

, daha önce ona bir 32bit dosyası gönderdiğini ve o bir hata var. Bu yüzden yeniden derlemek için 64 bit işletim sistemi kurmak zorunda kaldım. Gönderdiğim PHP uzantısı ile derledikleri arasındaki tek fark, "SYSV" nin benimkiyle 'GNU/Linux' demesidir. –

+0

Aynı sistemde her iki ikilide 'dosya' komutunu mu çalıştırdınız? – jschmier

+0

Evet, her ikisi de onun tarafından CentOS –

1

Derlenmiş nesne dosyaları genellikle farklı linux dağıtımları arasında iyi aktarım yapmaz. Farklı Dağılımlar genellikle kütüphaneler, depolandıkları yerler, nasıl yüklendikleri ile ilgili farklı politikalara sahiptir.

Aralarında çok fazla fark var (Evet, Fedora'da bile & RedHat/CentOS). Her seviyedeki bileşenlere kendi yamalarını sağlamaları muhtemeldir (çekirdek, PHP, kütüphane konumu). Dağıtım PHP paketini kullanıyorlarsa, dağıtım, sistemlerine daha iyi bir şekilde entegre edilmiş olabilir.

Muhtemelen karşılaşacağınız temel sorun, dağıtımın farklı bir kitaplık/derleyici ayarları kullanmasıdır. Gcc'nin bilgisayarda ne olduğunu görmek için kontrol edin ve sizinkiyle karşılaştırın. (Fedora 12, CentOS'tan çok daha yeni kütüphanelere sahiptir). Meselenin nerede olduğu burası.

Bir başka olası sorun, ikili dosyanızın iyi olduğu, ancak kullandığı tüm kitaplıklar ile uyumsuz olmasıdır. Hedef dağılımını (veya bir varyantı) derlemeden bunu aşmanın iyi bir yolu olup olmadığından emin değilim. lld <file> komutunu kullanarak her bir paylaşılan nesnenin/yürütülebilir dosyanın hangi kitaplıkların kullandığını görebilirsiniz.

Ayrıca, ELF file OS ABI invalid hatasından önce çıktı var mıydı? Referans gördüğüm çoğu yer bundan daha fazla bilgi var.

+0

'da çalıştırılıyordu. İyonCube'in (bir php uzantısının) tüm dağıtımlarda çalışan Linux için ikili dosyaları olduğunu biliyorum, onların dosyalarından birini işaretledim ve çıktı "ELF 64 bit LSB paylaşılan nesne , x86-64, sürüm 1 (SYSV), dinamik olarak bağlanmış ". GNU/LINUX yerine derlediğimde OS üstbilgisini SYSV olarak değiştirmek için herhangi bir seçenek bulamıyor, bu sorun gibi görünüyor. ldd, CentOS'unda 'dinamik bir uygulama değil' gösterir. –

+0

Linux Standart Tabanı'na (LSB) göz atmak isteyebilirsiniz. Kişisel olarak bununla ilgili deneyimim yok, ancak ihtiyacınız olan ikili uyumluluğu sağlayabilir. Dağıtımlar arasında çalışan bir PHP kütüphanesi geliştiren Ioncube küçük bir görev değildir, belki Firefox gibi tam bir uygulama yerine sadece bir kütüphane yapmak biraz daha basittir (bazı dağıtımlarda Firefox'un indirilebilir linux istemcisi ile çakışma olmuştur) – Reece45

İlgili konular