2012-05-30 8 views
31

मैंने एआरएम लक्ष्यों के लिए मैक ओएस एक्स पर न्यूलिब के साथ जीसीसी संकलित किया है। हालांकि, libc.a -fshort-enums के साथ संकलित किया गया था, और मुझे यह नहीं चाहिए क्योंकि जब मैं एआरएम के लिए सामान संकलित करता हूं, तो मैं -फनो-शॉर्ट-एनम्स का उपयोग करता हूं। निश्चित रूप से यह संघर्ष,:एआरएम के लिए न्यूलिब के साथ जीसीसी संकलन क्रॉस: जीसीसी विकल्पों को निर्दिष्ट करने के लिए कैसे करें? मार्च?

ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail 

हर बार जब मैं एक चलाने का प्रयास "नमस्कार, दुनिया!" निष्पादन योग्य, यह segfaults। क्या यह कारण हो सकता है?

यहाँ आदेश मैं hello.c संकलित करने के लिए प्रयोग किया जाता है:

arm-eabi-gcc \ 
hello.c -o hello \ 
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \ 
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \ 
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \ 
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \ 
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \ 
-v -nostdinc -nostdlib -static \ 
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \ 
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \ 
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \ 
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \ 
-I/Users/user/gcc-arm-install/arm-eabi/include \ 
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \ 
-L/Users/user/gcc-arm-install/arm-eabi/lib \ 
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \ 
-lm -lc -lgcc 

अद्यतन:

ठीक है, मुझे लगता है कि मैं newlib के libc और स्टार्टअप के संयोजन के लिए नीचे समस्या संकुचित कर दिया है फाइलें (crt0.o)। मैंने libc.a का उपयोग करके जीसीसी 4.7.0 के साथ एक टेस्ट ऐप संकलित करने और एंड्रॉइड एनडीके से स्टार्टअप फाइलों को संकलित करने का प्रयास किया, और स्थिर होने पर फोन पर काम किया। असल में, यह काम करता है, भले ही एलडी ने "वेरिएबल-साइज एनम्स" का उपयोग करके libgcc के बारे में शिकायत की है (यानी, सब कुछ की तरह -फनो-शॉर्ट-एनम्स के साथ संकलित नहीं)। तो, मेरी पिछली दुर्घटनाग्रस्त बाइनरी में अपराधी होने के बारे में मेरी परिकल्पना गलत थी।

यहाँ क्या काम कर रहा है: "। हाथ-linux-EABI"

binutils और जीसीसी 4.7.0 लक्ष्य के लिए स्रोत से संकलित मैंने जीसीसी को --with-newlib (जीसीसी के स्रोत पेड़ में न्यूलिब और libgloss) का उपयोग कर कॉन्फ़िगर किया। इसलिए, जीसीसी वास्तव में न्यूलिब के साथ बनाया गया था और न्यूलिब के साथ स्थापित किया गया था, और यह तब तक काम करने वाली बाइनरी उत्पन्न करता है जब तक कि मैं वास्तव में न्यूलिब के libc से लिंक नहीं करता हूं। वर्तमान में, मुझे एंडॉइड एनडीके और इसकी स्टार्टअप फाइलों के बजाय libc का उपयोग करना होगा।

मेरी संकलन स्क्रिप्ट इस तरह कुछ दिखती है। शामिल हैं और पुस्तकालय पथ इंगित करने के लिए NDK भी शामिल है और libc:

NDK_PATH="/Users/user/SOURCE/android-ndk-r8/platforms/android-9/arch-arm" 
CFLAGS="-nostdinc -nostdlib -static -fno-short-enums -lc -lgcc -lc" 

gcc $NDK_PATH/usr/lib/crtbegin_static.o \ 
hello.c -o hello $CFLAGS \ 
$NDK_PATH/usr/lib/crtend_android.o 

मैं अभी भी newlib के libc काम करने के साथ स्थिर संकलित युग्मक प्राप्त करना चाहते हैं। शेल स्क्रिप्टिंग पर वापस ...

+2

होगा जवाब देने में मुश्किल है लेकिन परीक्षण करने में आसान लगता है; क्या यह जांचना बहुत आसान नहीं है कि '-फोर्ट-एनम्स' के साथ हैलो.c को संकलित करना दुर्घटना को ठीक करता है? –

+0

क्या आपने [libc.a के स्रोत] (http://www.gnu.org/software/libc/) को डाउनलोड करने और इसे स्वयं संकलित करने पर विचार किया है? –

+0

-fshort-enums चेतावनी को दबाता है, लेकिन मुझे अभी भी एक क्रैश मिलता है :-( – Synthetix

उत्तर

2

काम के लिए मैं कॉर्टेक्स-एम 3 मंच के लिए क्रॉस-बिल्ड करता हूं, और मैं न्यूलिब का भी उपयोग करता हूं। निम्न लिंक आप के लिए सहायक हो सकता है:

http://frank.harvard.edu/~coldwell/toolchain/ http://www.microbuilder.eu/Tutorials/SoftwareDevelopment/BuildingGCCToolchain.aspx

हालांकि दिए गए लिंक कॉर्टेक्स- एम 3 के लिए विशिष्ट है, यह प्रदान कर सकता है आप के लिए कुछ अंतर्दृष्टि, मैं यह स्क्रिप्ट मेरे toolchain का निर्माण करने के लिए इस्तेमाल: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

आपका newlib miscompiled गया हो सकता है (शायद मेजबान संकलक के साथ अत्यधिक संभावना नहीं है, क्योंकि यह लिंक, लेकिन हे यह संभव है?)।

1

मुझे लगता है कि आप पहले काम env चुनने के लिए एक खोल स्क्रिप्ट लिख सकते हैं, जैसे आप जीसीसी या आर्म-जीसीसी के तहत काम करेंगे। इस स्क्रिप्ट में, आप अलग-अलग lib के लिए एक वैकल्पिक lib लिंक बना सकते हैं, जैसे कि आप लॉगिन करते हैं और जीसीसी चुनते हैं, lib फ़ाइल सामान्य libc होगी और यदि आप arm-gcc चुनते हैं, तो lib अलग-अलग