2012-06-26 32 views
6
$ printf 'int main(){}' | gcc -static -x c - -o hello 
$ scp hello vi-server.org:./ 
hello        100% 565KB 565.2KB/s 00:00 
$ ssh -t vi-server.org "./hello; uname -r" 
FATAL: kernel too old 
sh: line 1: 15378 Segmentation fault  ./hello 
2.6.18-274.... # can't easily upgrade the kernel 
Connection to vi-server.org closed. 

स्थिर बाइनरी कैसे बनाएं जो पुराने सिस्टम पर काम करेगी? मैं स्थिर बाइनरी 2.4 पर भी काम करने की उम्मीद करता हूं।पुराने कर्नेल के साथ जीएनयू/लिनक्स इंस्टॉलेशन के लिए स्थिर बाइनरी कैसे बनाएं?

उत्तर

8

आपको पुराने कर्नेल संस्करण को लक्षित करने के लिए glibc को कॉन्फ़िगर करने की आवश्यकता है। प्रति http://www.gnu.org/software/libc/manual/html_node/Configuring-and-compiling.html glibc कॉन्फ़िगरेशन विकल्प --enable-kernel=version स्वीकार करता है जहां version पुराने कर्नेल संस्करणों को लक्षित करने के लिए 2.4.20 रूप में है।

फिर आप gcc -static -nodefaultlibs [...] /path/to/my/libc.a के साथ अपने प्रोग्राम को स्थिर रूप से लिंक कर सकते हैं।

0

ऊपर पोस्टर ecatmur को धन्यवाद - यह वास्तव में पुन: कॉन्फ़िगर/कॉन्फ़िगर विकल्प --enable-कर्नेल के साथ glibc के पुनर्निर्माण के लिए काम करता है = संस्करण

मैं जोड़ना होगा निम्नलिखित हैं - आप जीसीसी स्थैतिक उपयोग कर सकते हैं -एल/​​पथ/से/स्थानीय/lib (निर्देशिका के लिए बड़ा एल विकल्प) और ऐसा लगता है कि यह पुस्तकालय फ़ाइल से जुड़ा हुआ है। जब मैंने बाद के फैशन में लिंक किया (/path/to/local/lib/libc.a), तो यह एक अनावश्यक रूप से बड़ा निष्पादन योग्य बना।

+2

नोट: अक्सर "आधा स्थैतिक" बाइनरी बनाने का विकल्प होता है। यह गतिशील रूप से libc से लिंक होगा, लेकिन अन्य पुस्तकालयों के लिए स्थैतिक रूप से (आप चुन सकते हैं कि कौन से पुस्तकालय बाइनरी में शामिल हैं और किससे लिंक करना है)। इसे लिंकिंग कमांड को मैन्युअल रूप से संपादित करके किया जा सकता है। –