मैंने एआरएम लक्ष्यों के लिए मैक ओएस एक्स पर न्यूलिब के साथ जीसीसी संकलित किया है। हालांकि, 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 काम करने के साथ स्थिर संकलित युग्मक प्राप्त करना चाहते हैं। शेल स्क्रिप्टिंग पर वापस ...
होगा जवाब देने में मुश्किल है लेकिन परीक्षण करने में आसान लगता है; क्या यह जांचना बहुत आसान नहीं है कि '-फोर्ट-एनम्स' के साथ हैलो.c को संकलित करना दुर्घटना को ठीक करता है? –
क्या आपने [libc.a के स्रोत] (http://www.gnu.org/software/libc/) को डाउनलोड करने और इसे स्वयं संकलित करने पर विचार किया है? –
-fshort-enums चेतावनी को दबाता है, लेकिन मुझे अभी भी एक क्रैश मिलता है :-( – Synthetix