Genişleyen Daha önce yaptığım bu not, bu kutunun içine sığmıyor (ve bu sadece bir fikir veya tartışma, lütfen kabul veya ödüllendirmekle yükümlü hissetmeyin), belki de bunu yapmanın en kolay ve en temiz yolu,'yi çıkarmak için post-build adımı Oluşan ikilidenbaşlık?
Başlıkları el ile düzenlemekten ve potansiyel olarak her şeyi değiştirmekten daha kolay olanı 'u PT_NULL
ile değiştirmektir. Dosyanın mevcut araçlarla (bir çeşit okunabilir hex bul ve değiştir) ya da bunu yapmak için küçük bir program yazmanız gerektiğinde bir yolunu bulup bulamayacağınızı bilmiyorum. Biliyorum ki, libbfd (GNU İkili Dosya Tanımlayıcı kütüphanesi), tüm işin çok daha kolay olmasını sağlayacağından, ikinci durumda arkadaşınız olabilir.
Sadece bunun neden bir ld
seçeneği aracılığıyla gerçekleştirildiğinin önemli olduğunu anlamıyorum. Varsa, neden tercih edileceğini görebiliyorum; ama bazı (göze batan ışık) Googling'in böyle bir özellik olmadığını göstermesi, bunu ayrı ayrı yapmak ve sonradan yapmak için daha az güçlük çekebilir. (Belki ld
bayrağı ekleyerek PT_NULL
ile PT_INTERP
değiştirilmesini komut dosyası, ancak akıntıya karşı farklı bir konudur çekmeye devs ikna daha kolaydır.) Bu bir şey ise
Görünüşe (ve beni düzeltin lütfen '' Zaten görüldüğü gibi '' ld
'un with the PHDRS
command linkerdeki ELF başlıklarından herhangi birine göre ve :none
ile herhangi bir segmente özel bir başlık tipinin dahil edilmemesi gerektiğini belirtebilirsiniz. Ben sözdizimi emin değilim, ama böyle bir şey olmazdı sanırım:
--library-path=searchdir
ekle yol searchdir: ld docs Eğer --library-path
ile bağlayıcı komut dosyası geçersiz kılabilir itibaren
PHDRS
{
headers PT_PHDR PHDRS ;
interp PT_INTERP ;
text PT_LOAD FILEHDR PHDRS ;
data PT_LOAD ;
dynamic PT_DYNAMIC ;
}
SECTIONS
{
. = SIZEOF_HEADERS;
.interp : { } :none
...
}
ld, arşiv kitaplıklarını ve ld denetim komut dosyalarını arayacak olan yolların listesine. Bu seçeneği herhangi bir kez kullanabilirsiniz. Dizinler, komut satırında belirtildikleri sırayla aranır. komut satırında belirtilen dizinler, varsayılan dizinlerden önce aranır. Tüm seçeneklerinin tümü, seçeneklerinin göründüğü sıraya bakmaksızın tüm -l seçenekleri için geçerlidir.Aranan varsayılan yollar ( `-L 'ile belirtilmemiş), hangi öykünme modunun kullandığını ve bazı durumlarda da nasıl yapılandırıldığına bağlı olarak bağlıdır. Çevre Değişkenler bölümüne bakınız. Yollar, SEARCH_DIR komutuyla bir link komut dosyasında da belirtilebilir. Bu şekilde belirtilen dizinler, linker betiğinin komut satırında göründüğü noktasında aranır. Ayrıca
,
the section on Implicit Linker Scripts den:
Eğer bağlayıcı bir nesne dosyası veya bir arşiv dosyası olarak tanıyamaz bir bağlayıcı girdi dosyasını belirtirseniz, bir dosyayı okumak için çalışacağız linker komut dosyası. Dosya bir bağlayıcı komut dosyası olarak ayrıştırılamıyorsa, bağlayıcı bir hata bildirir. örtülü olarak tanımlanan bağlayıcı komut aksine, kullanıcı tanımlı bağlayıcı komut değerleri ima etmek gibi görünüyor
, varsayılan komut değerlerin yerine geçer.
ben bu düz varsa bakayım. Kendi giriş noktanızı belirliyorsunuz, bu da bazı özel yer değiştirme işlemlerini ele alıyor ve çekirdeğin standart çeviricide yüklenmesini istemiyor musunuz? Eğer bir başlatmaya ihtiyaç duyduğunuz kütüphanelere karşı .init ile bağlantı kuruyorsanız? Benim deneyimlerimde, eğer yürütücülerinizle bir şeyler yapmak istiyorsanız, ancak LDFLAGS'in bazı permütasyonları ile onu üretmenin bir yolu yoktur, o zaman bu iyi bir fikir değildir. –
Bunu bir uygulamanın yapım sistemine koymaya çalışıyorsam,% 100 size katılıyorum. Bu gibi linker seçenekleri ile aptal bir uygulama için korkunç bir hack, ve bu zaten işe yaramaz çünkü çünkü tüm .a 'kütüphaneleri PIC olarak inşa edilmesini gerektirir. Bununla birlikte, üzerinde çalıştıklarım, setuid ikili dosyaları için dinamik bağlayıcıya sahip olmanın kabul edilemez bir risk olduğu güvenlik odaklı dağıtımlarda kullanılmak üzere tasarlanmış yeni bir takım zinciri seçeneğidir. 'Ld' düzeyinde, yalnızca gcc dosyası ve 'crt' düzeyinde herhangi bir değişiklik gerekmiyorsa dağıtmak çok daha kolaydır. –
görünüşe göre ld için bir yama yazmanız ve sonra neden sandığa uygulanması gerektiği konusunda tartışmanız gerekecek. Ayrıca, bu çok ilginç bir iş gibi geliyor. –