সংকলন "ails .rodata.str1.8 'এর বিপরীতে" স্থানান্তর R_X86_64_32' এর সাথে ব্যর্থ হয় একটি ভাগ করা অবজেক্ট তৈরি করার সময় ব্যবহার করা যায় না "


85

আমি একটি ভিপিএসে মেকফিল থেকে এই উত্স কোডটি সংকলনের চেষ্টা করছি, তবে এটি কার্যকর নয়। ভিপিএস একটি 64 সেন্ট ওএস

এখানে সম্পূর্ণ ত্রুটি

# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be     used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1

এখানে আমার মেকফাইল:

GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"

COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/

all:
    $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
    $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
    $(GPP) $(COMPILE_FLAGS) *.cpp
    $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o

কেউ কি জানেন ভুল কি?


7
আপনি চেষ্টা করেছেন recompile with -fPIC?
জোয়াকিম ইসাকসন

দুঃখিত তবে আমি কীভাবে এটি করব তা নিশ্চিত নই। গুগলে "-fPIC" সম্পর্কে কিছুই খুঁজে পাচ্ছেন না।
ব্যবহারকারী 1667191

4
এর মতো কিছু চেষ্টা করুনCOMPILE_FLAGS=-c -O3 -w -DLINUX -fPIC -I../SDK/amx/
জোয়াকিম ইসাকসন


11
যদি আপনি -fPIC এর জন্য গুগল অনুসন্ধান করেন তবে অবশ্যই কিছুই পাবেন না। বিয়োগটি সরান বা উদ্ধৃতি চিহ্নগুলি "-fPIC" ব্যবহার করুন অন্যথায় আপনি এফপিআইসিযুক্ত সমস্ত ফলাফল বাদ দেন।
d00d

উত্তর:


119

সংকলক আপনাকে যা করতে বলবে তা করুন, অর্থাত্ সংশোধন করুন -fPIC। এই পতাকাটি কী করে এবং এই ক্ষেত্রে আপনাকে এটির কেন প্রয়োজন তা জানতে , জিসিসি ম্যানুয়ালটির কোড জেনারেশন বিকল্পগুলি দেখুন ।

সংক্ষেপে বলতে গেলে, পজিশন ইন্ডিপেন্ডেন্ট কোড (পিআইসি) বলতে উত্পন্ন মেশিন কোডকে বোঝায় যা মেমরি অ্যাড্রেস অ্যাজোনস্টিক, অর্থাত্ এটি র‍্যামে কোথায় লোড হয়েছিল সে সম্পর্কে কোনও অনুমান করে না। কেবলমাত্র পজিশনে স্বতন্ত্র কোডটি ভাগ করে নেওয়া বস্তুগুলিতে (এসও) অন্তর্ভুক্ত করার কথা রয়েছে কারণ তাদের র্যামে তাদের অবস্থান পরিবর্তনশীল করার ক্ষমতা থাকতে হবে।

অবশেষে, আপনি উইকিপিডিয়ায় এটি সম্পর্কেও পড়তে পারেন ।


4
আপনি কীভাবে -fPIC এর সাথে পুনরায় সংকলন করবেন তা ব্যাখ্যা করতে পারেন?
বেনি বোগোসেল

13
@ বেনি বোগোসেল: এটি খুব সহজ। আপনি কেবল গ্রন্থাগারের -fPICসমস্ত উত্স ফাইল (অনুবাদ ইউনিট, উদাহরণস্বরূপ *.cppফাইল) এর জন্য সমস্ত সংকলক অনুরোধগুলিতে কেবল যুক্ত করুন । এটি করার দৃ concrete় উপায়টি আপনি যে বিল্ড সিস্টেমটি ব্যবহার করেন তার উপর নির্ভর করে। উদাহরণস্বরূপ, সিএমকে আপনি ইস্যু করতে পারেন set_target_properties(${LIBRARY_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)। এই লোকটির ক্ষেত্রে (প্লেইন ওল্ড মেক ব্যবহার করে), তাকে তার কাজটি করতে হবে COMPILE_FLAGS+=-fPICযেহেতু তিনি তার লাইব্রেরির সমস্ত উত্স ফাইলগুলির জন্য সংকলন পতাকাগুলির সেট বোঝাতে এই পরিবর্তনশীলটি ব্যবহার করছেন।
আলেকজান্ডার শুকায়েভ

4
কনফিগার ব্যবহার -fPIC সক্ষম করতে: কনফিগার --enable-ভাগ, দেখুন stackoverflow.com/a/850464/440403
Camino

50

আমার ক্ষেত্রে এই ত্রুটিটি ঘটেছে কারণ একটি makeআদেশ *.soএকটি LDFLAGSপরিবেশের ভেরিয়েবল দ্বারা নির্দেশিত একটি দূরবর্তী ডিরেক্টরি থেকে ভাগ করা লাইব্রেরি ( ফাইল) আনার প্রত্যাশা করেছিল । একটি ভুল হিসাবে, কেবল স্থির লাইব্রেরি সেখানে ( *.laবা *.aফাইল) উপলব্ধ ছিল ।

অতএব, আমার সমস্যাটি আমি যে প্রোগ্রামটি সংকলন করছিলাম তা দিয়ে রইল না তবে দূরবর্তী লাইব্রেরিগুলির সাথে এটি আনার চেষ্টা করা হয়েছিল। সুতরাং, -fPICস্থানান্তর ত্রুটির দ্বারা বাধাগ্রস্ত সংকলনে আমার কোনও পতাকা (বলুন ) যুক্ত করার দরকার নেই। পরিবর্তে, আমি রিমোট লাইব্রেরিটি পুনরায় কম্পাইল করেছিলাম যাতে ভাগ করা বস্তুগুলি উপলভ্য হয়।

মূলত, এটি ছদ্মবেশে একটি ফাইল খুঁজে পাওয়া যায়নি ত্রুটি।

আমার ক্ষেত্রে প্রয়োজনীয় প্রোগ্রামের জন্য অনুরোধের সময় আমাকে একটি ভুল জায়গায় --disable-sharedস্যুইচ সরিয়ে ফেলতে হয়েছিল configure, কারণ ভাগ এবং স্থির লাইব্রেরি উভয়ই ডিফল্ট হিসাবে নির্মিত হয়েছিল।


আমি লক্ষ্য করেছি যে বেশিরভাগ প্রোগ্রাম একই সাথে উভয় ধরণের লাইব্রেরি তৈরি করে, তাই আমার সম্ভবত একটি কোণার কেস। সাধারণভাবে, এটি এমন ক্ষেত্রে হতে পারে যে আপনাকে ডিফল্টের উপর নির্ভর করে ভাগ করে নেওয়া লাইব্রেরিগুলি সক্ষম করতে হবে।

সংকলন সুইচ এবং ডিফল্টগুলি দিয়ে আপনার নির্দিষ্ট পরিস্থিতিটি পরীক্ষা করার জন্য, আমি ./configure --help | lessসাধারণত ptionচ্ছিক বৈশিষ্ট্যগুলি বিভাগে সংক্ষিপ্তসারটি প্রকাশ করব। আমি প্রায়শই দেখতে পেলাম যে নির্ভরতা প্রোগ্রামগুলি বিকশিত হওয়ার সময় আপডেট হওয়া যায় না এমন ইনস্টলেশন গাইডের চেয়ে এই পঠনটি আরও নির্ভরযোগ্য।


4
নিখুঁত, "এটি ছদ্মবেশে একটি ফাইল খুঁজে পাওয়া যায়নি ত্রুটি" " আমার ক্ষেত্রে নির্ভরতা এখনও ইনস্টল করা হয়নি।
লিট্টি

+1 আমার ক্ষেত্রে, ওপেনসেলের একটি নতুন অনুলিপি ম্যানুয়ালি নির্মিত এবং ভাগ করা লাইব্রেরি ছাড়াই ইনস্টল করা হয়েছিল। আমি যে লাইব্রেরিটি তৈরির চেষ্টা করছি সেটি ইতিমধ্যে -fPIC দিয়ে সংকলিত হয়েছে। যে কোনও উপায়ে কি কমপাইলারটি কম অস্পষ্ট ত্রুটি বার্তা দিতে এই ত্রুটিটি স্বীকৃতি দিতে পারে, উদাহরণস্বরূপ "ভাগ করে নেওয়া লাইব্রেরি libssl.so খুঁজে পাওয়া প্রত্যাশিত, তবে কেবল বেমানান স্ট্যাটিক লাইব্রেরি /usr/local/ssl/lib/libssl.a পাওয়া গেছে।" ?
রোহন মাহী

4
ধন্যবাদ আমার একটি মেক-জে ছিল এবং এই সফ্টওয়্যার প্যাকেজের জন্য সমান্তরাল মৃত্যুর অনুমতি দেওয়া হয়নি।
মাইকবার্গম্যান

আমার ক্ষেত্রে, আমার এই লাইনটি "find_library (NGHTTP2_LIB নামস libnghttp2.a libnghttp2.so libnghttp2.dylib)" রয়েছে। কি এটা কাজ করার জন্য ব্যবহার করার আগে আমার জন্য এবং এটি শুধুমাত্র .a এক গোছগাছ, আমি পরে find_library চাই, পরিবর্তিত (NGHTTP2_LIB NAMES এর libnghttp2.so libnghttp2.a libnghttp2.dylib) "এবং এটি কাজ শুরু আমার উদ্বেগের বিষয়।?
নাবা চিন্ডে

4
@ নাবাচিিন্দে আমি আশঙ্কা করছি আপনার প্রশ্নের উত্তর আমার কাছে নাও রয়েছে কারণ আপনার ফলাফল সম্পর্কে আমার কাছে প্রাসঙ্গিক তথ্যের অভাব রয়েছে। আমি অবশ্যই একটি পৃথক প্রশ্ন পোস্ট করতে উত্সাহিত করব যাতে আপনি আপনার কাজের পরিস্থিতি এবং অপ্রত্যাশিত আচরণের ব্যাখ্যা দিয়েছেন।
জ্যাভিয়ারস্টুউ

11

সংকলন পতাকাগুলি সম্পর্কে এটি সবসময় হয় না, ডিস্টিসি ব্যবহার করার সময় ভেন্টুতে আমার একই ত্রুটি থাকে।

কারণটি হ'ল ডিস্টিসি সার্ভারে নন-কড়া প্রোফাইল ব্যবহার করা হয় এবং ক্লায়েন্টে প্রোফাইল কঠোর হয়। এই আলোচনাটি দেখুন: https://forums.gentoo.org/viewtopic-p-7463994.html


10

-no-pieলিঙ্কার পর্যায়ে বিকল্পের সাথে এটি স্থির করে :

g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...

4

কেবলমাত্র প্রকল্পটি পরিষ্কার করা আমার জন্য এটি সমাধান করেছে।

আমার প্রকল্পটি একটি সি ++ অ্যাপ্লিকেশন (কোনও ভাগ করা লাইব্রেরি নয়)। প্রচুর সফল নির্মাণের পরে আমি এলোমেলোভাবে এই ত্রুটি পেয়েছি।


2

আমারও একই সমস্যা ছিল। -fPICপতাকা ব্যবহার করে পুনরায় কম্পাইল করার চেষ্টা করুন ।


0

আমি https://stackoverflow.com/a/19365454/10593190 এবং জাভিয়েরস্টুউউ এর জবাব @ কেমিনোর মন্তব্যের মত একই সমাধান পাচ্ছি

আমি এটিকে কাজ শুরু করে দিয়েছি (ffmpeg ইনস্টল করার জন্য) $ ./configureপ্রতিস্থাপনের সমস্ত দৃষ্টান্তের সাথে শুরু থেকে পুরো জিনিসটি পুনরায় ইনস্টল করে $ ./configure --enable-shared(প্রথমে পূর্ববর্তী প্রচেষ্টা থেকে .so ফাইলগুলি সহ সমস্ত ফোল্ডার এবং ফাইলগুলি মুছতে নিশ্চিত করুন)।

দৃশ্যত এটি কাজ করে কারণ https://stackoverflow.com/a/13812368/10593190

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.