gcc - कैसे एक एकल जीसीसी(क्रॉस-) कंपाइलर के साथ एआरएम हार्ड और सॉफ्ट-फ़्लोट(सॉफ्टफिप) दोनों को(क्रॉस-) संकलन करता है?




arm calling-convention (2)

Linaro FAQ के अनुसार यदि आपका कंपाइलर arm-linux-gnueabi;@[email protected][email protected]=soft प्रिंट arm-linux-gnueabi;@[email protected][email protected]=soft तो आप केवल -march=armv4t उपयोग कर सकते हैं यदि आप -march=armv7-a का उपयोग करना चाहते हैं -march=armv7-a आप को संकलक को स्वयं बनाने की आवश्यकता है

निम्नलिखित लिंक अपने आप को जीसीसी एआरएम बिल्ड्स बनाने में सहायक हो सकता है

मैं अलग-अलग एआरएम कॉलिंग सम्मेलनों के लिए कोड को संकलित करने के लिए एक एकल (क्रॉस-) कंपाइलर का उपयोग करना चाहता हूं: चूंकि मैं हमेशा फ्लोटिंग पॉइंट और नीयन निर्देशों का उपयोग करना चाहता हूं, मैं कड़ी मेहनत वाले कॉलिंग सम्मेलन या सॉफ्ट फ्लोट का चयन करना चाहता हूं (सॉफ्टफप) कॉलिंग सम्मेलन

मेरे कंपाइलर हार्ड-फ्लोट के लिए डिफ़ॉल्ट हैं, लेकिन यह उन दोनों आर्किटेक्चर का समर्थन करता है जिन्हें मुझे चाहिए:

$ arm-linux-gnueabihf-gcc -print-multi-lib
.;
arm-linux-gnueabi;@[email protected]=[email protected]-abi=soft
$

जब मैं डिफ़ॉल्ट मानकों का संकलन करता हूँ:

$ arm-linux-gnueabihf-g++ -Wall -o hello_world_armhf hello_world.cpp

यह बिना किसी त्रुटि के सफल होता है

अगर मैं -प्रिंट-मल्टी- lib द्वारा लौटा गया मापदंडों का संकलन करता हूं:

$ arm-linux-gnueabihf-g++ -marm -march=armv4t -mfloat-abi=soft -Wall -o hello_world hello_world.cpp

यह फिर से त्रुटि के बिना संकलित करता है (वैसे, मैं कैसे परीक्षण कर सकता हूँ कि परिणामी कोड कठिन है या नरम फ्लोट?)

दुर्भाग्य से, अगर मैं यह कोशिश करता हूं:

$ arm-linux-gnueabihf-g++ -march=armv7-a -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -Wall -o hello_world hello_world.cpp
[...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: error: hello_world uses VFP register arguments, /tmp/ccwvfDJo.o does not
[...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: failed to merge target specific data of file /tmp/ccwvfDJo.o
collect2: error: ld returned 1 exit status
$

मैंने पैरामीटर्स के कुछ अन्य क्रमपरिवर्तनों का परीक्षण किया है, लेकिन ऐसा लगता है कि किसी भी त्रुटि के परिणामस्वरूप दिखाए गए संयोजन के अलावा कुछ भी।

मैंने एआरएम संकलन त्रुटि पढ़ी है , निष्पादन योग्य द्वारा उपयोग किए गए वीएफपी पंजीकृत नहीं, ऑब्जेक्ट फ़ाइल नहीं, लेकिन समस्या यह थी कि बाइनरी के कुछ हिस्से नरम थे- और कुछ कठिन फ्लोट थे मेरे पास संकलित करने के लिए एक सी ++ फाइल है ...

क्या पैरामीटर (मैसेज) मैं -march = armv7-a-mthumb-interwork -mfloat-abi = softfp -mfpu = neon के साथ संकलित करने में सक्षम होने के लिए याद आती है?

यह कैसे संभव है कि त्रुटि VFP पंजीकरण तर्कों के बारे में है, जबकि मुझे स्पष्ट रूप से कमांड लाइन में mfloat-abi = softfp है जो VFP पंजीकरण तर्कों को प्रतिबंधित करता है?

धन्यवाद!

रिकॉर्ड के लिए, hello_world.cpp में निम्न शामिल हैं:

#include <iostream>

int main()
{
  std::cout << "Hello, world!" << std::endl;
  return 0;
}

संबंधित multilib समर्थन के साथ आपको एक और संकलक की आवश्यकता है आप अगले कमांड के साथ multilib समर्थन देख सकते हैं।

arm-none-eabi-gcc -print-multi-lib
.;
thumb;@mthumb
fpu;@mfloat-abi=hard
armv6-m;@[email protected]=armv6s-m
armv7-m;@[email protected]=armv7-m
armv7e-m;@[email protected]=armv7e-m
armv7-ar/thumb;@[email protected]=armv7
cortex-m7;@[email protected]=cortex-m7
armv7e-m/softfp;@[email protected]=armv7e-[email protected]-abi=[email protected]=fpv4-sp-d16
armv7e-m/fpu;@[email protected]=armv7e-[email protected]-abi=[email protected]=fpv4-sp-d16
armv7-ar/thumb/softfp;@[email protected]=[email protected]-abi=[email protected]=vfpv3-d16
armv7-ar/thumb/fpu;@[email protected]=[email protected]-abi=[email protected]=vfpv3-d16
cortex-m7/softfp/fpv5-sp-d16;@[email protected]=cortex-[email protected]-abi=[email protected]=fpv5-sp-d16
cortex-m7/softfp/fpv5-d16;@[email protected]=cortex-[email protected]-abi=[email protected]=fpv5-d16
cortex-m7/fpu/fpv5-sp-d16;@[email protected]=cortex-[email protected]-abi=[email protected]=fpv5-sp-d16
cortex-m7/fpu/fpv5-d16;@[email protected]=cortex-[email protected]-abi=[email protected]=fpv5-d16
https://.com/questions/37418986/how-to-interpret-the-output-of-gcc-print-multi-lib

जीसीसी -print-multi-lib के आउटपुट की व्याख्या कैसे करें इस विन्यास के साथ gcc -mfloat-abi=hard न केवल आपके फाइलों को एकजुट करें, बल्कि उन्हें संबंधित लिबड्स के साथ लिंक भी करें, "एक्स का उपयोग वीएफपी रजिस्टर आर्ग्यूमेंट्स से बचें , वाई करता है नहीं " त्रुटि

इस पैच के साथ जीसीसी द्वारा उत्पादित उपर्युक्त- -print-multi-lib आउटपुट और --with-multilib-list=armv6-m,armv7,armv7-m,armv7e-m,armv7-r,armv7-a,cortex-m7 कॉन्फ़िगरेशन विकल्प अगर आप कोर्टेक्स-ए श्रृंखला बहुबिंघ समर्थन के साथ अपना जीसीसी बनाने में रुचि रखते हैं, तो किसी भी arm*-*-* लिए --with-multilib-list=aprofile कॉन्फ़िगरेशन विकल्प का उपयोग --with-multilib-list=aprofile किसी भी पैच के बिना ( जीसीसी --with-multilib-list=aprofile साथ सूची में) 0 )।