c - रथम - सार्वजनिक पुस्तकालय का पूर्ण व्यय किसके द्वारा किया जाता है



Armv5 के लिए क्रॉस-कंपाइलिंग नोड द्वारा पुस्तकालय संगतता (1)

अंत में, पुस्तकालयों को बदलने की कोशिश करने के बजाय, मैंने एक बेहतर क्रॉस-कंपाइलर का फैसला किया जो मेरे लक्ष्य से पूरी तरह से मेल खाता है।

मैंने इसके लिए क्रोसस्टल-एनजी का उपयोग किया था, लेकिन मैं आधिकारिक क्यूएनएपी मैक्सवेल-एआरएम टूलचैन का इस्तेमाल भी कर सकता हूं (मैंने इसे बहुत देर तक देखा था ...)

gcc (GCC) 4.2.4
g++ (GCC) 4.2.4
GNU ld (crosstool-NG 1.20.0) 2.19.1
ldd (crosstool-NG) 1.20.0
Python 2.7.6 (with gyp)

लेकिन एक समस्या हमेशा यहां थी, वहाँ एक नोड निर्भरता ( लिविव ) है जो लिनक्स-परमाणु नामक पुस्तकालय का उपयोग करती है, और वह पुस्तकालय संस्करण 4.4.X से जीसीसी में पेश किया गया था। तो मैं इसे ठीक करने के लिए किया गया उपाय है:

cd /src
wget -q https://ftp.gnu.org/gnu/gcc/gcc-4.6.3/gcc-core-4.6.3.tar.gz
tar -zxf gcc-core-4.6.3.tar.gz
sed -i -e 's/define HIDDEN.*/define HIDDEN/' /src/gcc-4.6.3/gcc/config/arm/linux-atomic.c
export CC=arm-none-linux-gnueabi-gcc
export AR=arm-none-linux-gnueabi-ar
export RANLIB=arm-none-linux-gnueabi-ranlib
cd /src/gcc-4.6.3/gcc/config/arm
libtool --tag=CC --mode=compile $CC -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c
$AR cru /src/gcc-4.6.3/gcc/config/arm/.libs/liblinux-atomic.a /src/gcc-4.6.3/gcc/config/arm/.libs/linux-atomic.o
$RANLIB /src/gcc-4.6.3/gcc/config/arm/.libs/liblinux-atomic.a

# IMPORTANT: Assign environment variables like I made in my question above.

# Go to node src dir and configure
./configure --without-snapshot --dest-cpu=arm --dest-os=linux --prefix="${PREFIX_DIR}"

# When configuration is done, edit out/node.target.mk
vi out/node.target.mk

# Find LD_INPUTS files list and add your new library as last one:
# -> /src/gcc-4.6.3/gcc/config/arm/.libs/liblinux-atomic.a

# Now you can build node !
make -j4   #-jX where X is the number of available cores
make install DESTDIR=$TEMPDIR # Use DESTDIR to avoid installation directly in $PREFIX_DIR path

वैकल्पिक हल

उस विन्यास के साथ, मैं एक्स 86 प्रोसेसर के लिए जीसीसी 4.1.3 के साथ नोड को संकलित भी कर सकता था। और मैंने क्यूएनपीएपी उपयोगकर्ताओं के लिए क्यूपीकेजी बनाया जो स्वत: द्वारा संकलित नहीं करना चाहते हैं: https://github.com/jbltx/nodejs-QPKG/tree/master/node-v0.10.35

मैं अपने QNAP armv5te मशीन के लिए नोड को क्रॉस-कंपाइल करने का प्रयास करता हूं, मेरे उबुंटू 14.04 डेस्कटॉप x64 पर।

एक नोड QPKG QNAP App-center में मौजूद है, लेकिन इसका संस्करण पुराना है (0.8.22)।
यहां सर्वर के बारे में जानकारी दी गई है:

लिनक्स सर्वर 3.4.6 # 1 सोम दिसम्बर 06 06:47:47 सीएसटी 2014 हथौड़ा 55 अज्ञात अज्ञात
प्रोसेसर का नाम : Feroceon 88F6281 rev 1 (v5l) @ 1.2 गीगाहर्ट्ज़
बोगोएमआईप्स : 1196.85
विशेषताएं : एसपीपी आधा अंगूठा तेजी से बढ़त
सीपीयू कार्यान्वयन : 0x56
सीपीयू वास्तुकला : 5TE
सीपीयू संस्करण : 0x2
CPU भाग : 0x131
सीपीयू संशोधन : 1
हार्डवेयर : फ़ायरसॉन-केडब्ल्यू
एआरएम संशोधन : 0000
सीरियल : 0000000000000000

मैं अपने डेस्कटॉप पर उपयोग किया गया आदेश यहाँ है:

apt-get update
apt-get upgrade
apt-get install emdebian-archive-keyring
apt-get install libc6-armel-cross libc6-dev-armel-cross
apt-get install binutils-arm-linux-gnueabi
apt-get install gcc-4.7-arm-linux-gnueabi
apt-get install g++-4.7-arm-linux-gnueabi
apt-get install u-boot-tools
apt-get install libncurses5-dev
ln -s /user/bin/arm-linux-gnueabi-gcc-4.7 /usr/bin/arm-linux-gnueabi-gcc
ln -s /user/bin/arm-linux-gnueabi-g++-4.7 /usr/bin/arm-linux-gnueabi-g++

wget http://nodejs.org/dist/node-v0.10.35/node-v0.10.35.tar.gz
tar -zxf node-v0.10.35.tar.gz
cd node-v0.10.35

export TOOL_PREFIX="arm-linux-gnueabi"
export CC="${TOOL_PREFIX}-gcc"
export CXX="${TOOL_PREFIX}-g++"
export AR="${TOOL_PREFIX}-ar"
export RANLIB="${TOOL_PREFIX}-ranlib"
export LINK="${CXX}"
export CCFLAGS="-march=armv5te -mfpu=softfp -marm"
export CXXFLAGS="-march=armv5te -mno-unaligned-access"
export OPENSSL_armcap=5
export GYPFLAGS="-Darmeabi=soft -Dv8_can_use_vfp_instructions=false -Dv8_can_use_unaligned_accesses=false -Darmv7=0"
export VFP3=off
export VFP2=off

./configure --without-snapshot --dest-cpu=arm --dest-os=linux --prefix="/root/.nvm/v0.10.35"
make -j 4
make install
tar -zcf node-v0.10.35-linux-armv5.tar.gz v0.10.35

संकलन इन मापदंडों के साथ कोई विफलता नहीं दिखाता है। इसलिए उसके बाद मैं अपने QNAP सर्वर से टारबॉल भेजता हूं:

scp /root/.nvm/node-v0.10.35-linux-armv5.tar.gz [email protected]:/share/HDA_DATA/.qpkg/nodejs
ssh SERVERNAME -l admin
cd /share/HDA_DATA/.qpkg/nodejs
tar -zxf node-v0.10.35-linux-armv5.tar.gz
ln -s v0.10.35 node

मेरे सभी env चर पहले से ही मेरे सर्वर पर सेट कर रहे हैं अब मैं नोड बाइनरी का परीक्षण कर सकता हूं ...

# node -v
node: /usr/lib/libstdc++.so.6: version `CXXABI_ARM_1.3.3' not found (required by node)
node: /lib/libc.so.6: version `GLIBC_2.15' not found (required by node)
node: /lib/libc.so.6: version `GLIBC_2.11' not found (required by node)
node: /lib/libc.so.6: version `GLIBC_2.7' not found (required by node)

अंत में मुझे एक त्रुटि है क्योंकि सी पुस्तकालयों उबंटू और कन्नड़ पर समान नहीं हैं, उबंटू डेस्कटॉप के लिए मेरे पास ldd (Ubuntu EGLIBC 2.19-0ubuntu6.5) 2.19 और ldd (Ubuntu EGLIBC 2.19-0ubuntu6.5) 2.19 ldd (GNU libc) 2.5

libc-dev और libstdc ++ संकुल को कंटैप पर ऑप्टवेयर आईपीकेजी द्वारा प्रबंधित किया जाता है, (पुराने संस्करण भी)।

मेरा प्रश्न यह समस्या ठीक करने का बेहतर तरीका क्या है? सर्वर पर लिब्स को अपडेट करने के लिए मजबूर? (और यह कैसे करें?) या फिर संकलन के दौरान स्थिर लिब्ज़ का उपयोग करें? (और वह भी कैसे करें?) या अन्य विकल्प?

संपादित करें:

अनावश्यक शोर के साथ मेरी बातचीत के बाद, मुझे समझ में आया कि मेरे पास लाइब्रेरी निर्भरता को ठीक करने के कई तरीके हैं ...

प्रश्न में निर्भरता:

# ldd /opt/bin/node
/opt/node/bin/node: /usr/lib/libstdc++.so.6: version `CXXABI_ARM_1.3.3' not found (required by /opt/node/bin/node)
/opt/node/bin/node: /lib/libc.so.6: version `GLIBC_2.15' not found (required by /opt/node/bin/node)
/opt/node/bin/node: /lib/libc.so.6: version `GLIBC_2.11' not found (required by /opt/node/bin/node)
/opt/node/bin/node: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /opt/node/bin/node)
        libdl.so.2 => /lib/libdl.so.2 (0xb6ed2000)
        librt.so.1 => /lib/librt.so.1 (0xb6ec3000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6de2000)
        libm.so.6 => /lib/libm.so.6 (0xb6d32000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6d1e000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb6cfe000)
        libc.so.6 => /lib/libc.so.6 (0xb6bca000)
        /lib/ld-linux.so.3 (0xb6ee4000)
  • उबंटू जीसीसी से लक्ष्य मशीन पर पुस्तकालयों की प्रतिलिपि बनाएँ, और डिफ़ॉल्ट लोगों को ओवरराइड करें:
    यह वास्तव में खतरनाक हो सकता है, और सिस्टम को ईंट कर सकता है अधिक करने के लिए, मेरा लक्ष्य QNAP समुदाय के लिए एक QPKG बनाना है, इसलिए लोगों को उनके सी लिब्स को ओवरराइड करने के लिए कहें, वास्तव में एक अच्छी विधि नहीं है

  • लाइब्रेरी कॉपी करें और मूल लोगों के साथ सहवास करें:
    एक अच्छी विधि, बस LD_LIBRARY_PATH को डीआईआर के लिए आवेदन के लिए नवीनतम लिब्स युक्त सेट करना होगा। लेकिन मुझे इस पद्धति का उपयोग करते हुए एक त्रुटि मिली, फिर से c ++ lib के साथ।

त्रुटि:

node: symbol lookup error: /opt/node/lib/c/libstdc++.so.6: undefined symbol: _ZNSt11__timepunctIcE2idE, version GLIBCXX_3.4
  • एक स्थिर अनुप्रयोग बनाएं:
    अंत में, मुझे संकलन के दौरान इसे बिना किसी त्रुटि के करने का तरीका मिला, और लक्ष्य मशीन पर निष्पादन के दौरान। बस कुछ झंडे जोड़ने की जरूरत है

नया झंडे:

export CCFLAGS="-march=armv5te -mfpu=softfp -marm -static-libgcc"
export CXXFLAGS="-march=armv5te -mno-unaligned-access -static-libstdc++"
export LDFLAGS="-static"

गतिशील लाइब्रेरी लिंक की जांच कर रहा है:

# ldd /opt/bin/node
    not a dynamic executable
# npm version
{ test: '1.0.0',
  npm: '2.3.0',
  ares: '1.9.0-DEV',
  http_parser: '1.0',
  modules: '11',
  node: '0.10.35',
  openssl: '1.0.1j',
  uv: '0.10.30',
  v8: '3.14.5.9',
  zlib: '1.2.8' }

संपादित करें: अंत में एक समस्या फिर से यहाँ है, अधिकांश नोड फ़ंक्शंस काम करते हैं, लेकिन http नहीं ...

मैंने एक वेब पेज के बारे में जानकारी प्राप्त करने के लिए एक सरल स्क्रिप्ट (नोडजेएस एपीआई से) का परीक्षण किया:

http.get("http://www.google.com/index.html", function(res) {
  console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

और मुझे मिल Got error: getaddrinfo ENOTFOUND , क्या यह संभव है क्योंकि नोड स्थिर है कुछ सुविधाएं काम नहीं कर सकती हैं?