জিসিসিতে ভাগ করা লাইব্রেরি ফাংশনের স্থির লিঙ্ক


138

আমি কীভাবে স্থিতিশীলভাবে জিসিসিতে একটি ভাগ করা লাইব্রেরি ফাংশনটি যুক্ত করতে পারি?


13
স্থিরভাবে সংযুক্ত বলতে কী বোঝ? আপনি কি চান যে আপনার নির্বাহীটিকে .so প্রয়োজন ছাড়াই বিতরণ করা হবে?
এমিলিয়ানো

উত্তর:


108

নির্দেশ করে:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

এটির লিঙ্ক করার জন্য আপনার লাইব্রেরির স্থির সংস্করণ প্রয়োজন।

একটি ভাগ করা লাইব্রেরি প্রকৃতপক্ষে একটি নির্দিষ্ট বিন্যাসে নির্ধারিত এন্ট্রি পয়েন্ট সহ এক্সিকিউটেবল (এবং কিছু স্টিকি ঠিকানা সম্বলিত বিষয় অন্তর্ভুক্ত)। এটি স্ট্যাটিকালি লিঙ্ক করতে প্রয়োজনীয় সমস্ত তথ্য নেই।

আপনি স্ট্যাটিকভাবে একটি ভাগ করা লাইব্রেরি লিঙ্ক করতে পারবেন না (বা একটি স্ট্যাটিক একটি গতিশীল লিঙ্ক)।

পতাকা -staticলিঙ্কারকে ভাগ করা (.so) পরিবর্তে স্থির লাইব্রেরি (.a) ব্যবহার করতে বাধ্য করবে। তবে স্থির লাইব্রেরিগুলি সর্বদা ডিফল্টরূপে ইনস্টল করা হয় না, তাই আপনাকে নিজেরাই স্থির লাইব্রেরি ইনস্টল করতে হতে পারে।

অন্য সম্ভাব্য পদ্ধতির ব্যবহার করা statifier বা নকুলজাতীয় জন্তুবিশেষ । উভয় সরঞ্জামই ইনপুট হিসাবে গতিশীলভাবে সংযুক্ত এক্সিকিউটেবল হিসাবে নেয় এবং আউটপুট হিসাবে এম্বেড থাকা সমস্ত ভাগ করে নেওয়া লাইব্রেরি সহ একটি স্ব-অন্তর্ভুক্ত এক্সিকিউটেবল তৈরি করে।


11
স্ট্যাটিক লাইব্রেরির কী তথ্য রয়েছে, যাতে এটি স্থিরভাবে সংযুক্ত করা যায়, যে গতিশীল লাইব্রেরিতে নেই?
kbolino

75

আপনি যদি লিঙ্ক করতে চান, বলুন, libapplejuice স্ট্যাটিক্যালি, কিন্তু না, বলুন, লাইব্রোঞ্জজাইস , আপনি এই জাতীয় লিঙ্ক করতে পারেন:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

একটি সতর্কতা রয়েছে - যদি liborangejuiceব্যবহার হয় libapplejuice, তবে libapplejuiceগতিশীলভাবে খুব যুক্ত হবে।

liborangejuiceস্ট্যাটিক হওয়ার libapplejuiceজন্য আপনাকে স্ট্যাটিকালি পাশাপাশি লিঙ্ক করতে হবে libapplejuice

এবং -Wl,-Bdynamicঅন্যটি রাখতে ভুলবেন না যে আপনি সমস্ত স্থিতিশীল লিঙ্কটি শেষ করবেন, সহ libc(যা করা ভাল নয়)।


2
স্থিতিশীলভাবে কী লিঙ্ক করবেন, এবং তাকে বাইপাস না করে লিঙ্কারের সাথে কথা বলার নয়, সরাসরি জিসিসিকে বলার উপায় নেই?
এলাজার লাইবোভিচ

1
@ ইলজারলিবুভিচ আপনি স্থিতিশীল এবং গতিশীল এর মিশ্রণ পেতে পারেন না।
হাওজুন

@ ইউজিনবুজাক: ক্যাভিয়েট আমার সিস্টেমে প্রযোজ্য নয়। উদাহরণ: gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L. libB libA ব্যবহার করে , এটি লিঙ্কযুক্ত এবং লিবাএরldd কোনও রেফারেন্স দেখায় না । এক্সিকিউটেবল ভাল কাজ করে। জি ++ 4.7.3 দিয়ে পরীক্ষিত।
র‌্যাডিক্স

প্রত্যক্ষ, গতিশীল, নির্ভরতা একটি পরোক্ষ (নেস্টেড), স্থিতিশীল, নির্ভরতা নিজেই গতিবেগের সাথে যুক্ত হয় না।
Vinny

নিম্নলিখিতটি বিবেচনা করুন: বিনা libB.so এর উপর নির্ভর করে যা libC.a এর উপর নির্ভর করে যেমন অন্যরা ইতিমধ্যে জানিয়েছে যে, সুতরাং সেগুলি নিজেই এক্সিকিউটেবল হয়, সুতরাং যখন কোনও ভাগ করা বস্তুটি সংযুক্ত থাকে, তখন কোনও স্থির গ্রন্থাগার নির্ভরকারীরা লিংক দ্বারা প্রসেস করা হয় ঠিক তেমনই একটি এক্সিকিউটেবলকে যুক্ত করা হচ্ছিল: .a স্ট্যাটিক লাইব থেকে টানা একমাত্র প্রতীকগুলি হ'ল .so দ্বারা চিহ্নিত (এবং সমাধান না করা) d এর অর্থ হ'ল যদি বিনা libC.a- তে কোনও চিহ্নকে উল্লেখ করে, libB.so এর কোথাও রেফারেন্স করা না হয়, তবে এমনকি বিনা যদি libB.so এর সাথে লিঙ্ক করে তবে সেই চিহ্নটি পূর্বনির্ধারিত হবে (-Wl বাদে, - লিঙ্ক করার সময় পুরো সংরক্ষণাগারটি ব্যবহৃত হবে) libB.so)।
ভিনি

18

আপনার যদি আপনার ভাগ করা লাইব্রেরির (.so) .a ফাইল থাকে তবে আপনি কেবল এটির পুরো পথটি সহ এটি অন্তর্ভুক্ত করতে পারেন যেন এটি কোনও অবজেক্ট ফাইল was

এটি কেবল সংকলন করে main.o উত্পন্ন করে:

gcc -c main.c

এটি সম্পর্কিত স্ট্যাটিক লাইব্রেরির সাথে ফাইল যুক্ত করা এবং কার্যকর করা ("প্রধান" নাম দেওয়া হয়েছে) তৈরি করে:

gcc main.o mylibrary.a -o main

বা একক আদেশে:

gcc main.c mylibrary.a -o main

এটি একটি নিখুঁত বা আপেক্ষিক পথও হতে পারে:

gcc main.c /usr/local/mylibs/mylibrary.a -o main

12

হ্যাঁ, আমি জানি এটি একটি 8 বছরের পুরানো প্রশ্ন, তবে আমাকে বলা হয়েছিল যে কোনও শেয়ার্ড-অবজেক্ট লাইব্রেরির সাথে স্থিতিশীলভাবে লিঙ্ক করা সম্ভব ছিল এবং আমি যখন এটি সম্পর্কে আরও তথ্যের জন্য অনুসন্ধান করেছি তখন এটি আক্ষরিক অর্থে শীর্ষে ছিল।

প্রকৃতপক্ষে প্রমাণ করতে যে কোনও শেয়ার্ড-অবজেক্ট লাইব্রেরির সাথে স্থিতিশীলভাবে লিঙ্ক করা সম্ভব নয় ld( gccএর লিঙ্কার) - কেবলমাত্র একগুচ্ছ লোকেরা এটি সম্ভব নয় বলে জোর দিয়েছিল - নিম্নলিখিত gccকমান্ডটি ব্যবহার করুন :

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(অবশ্যই আপনার objectname.oকাছ থেকে সংকলন sourcename.cকরতে হবে এবং আপনার সম্ভবত নিজের শেয়ারড-অবজেক্ট লাইব্রেরিটিও তৈরি করা উচিত you যদি আপনি -Wl,--library-path,.এটি করেন তবে এটি ব্যবহার করুন যাতে এলডি আপনার স্থানীয় লাইব্রেরিটি স্থানীয় ডিরেক্টরিতে খুঁজে পেতে পারে))

আপনি প্রাপ্ত প্রকৃত ত্রুটিটি হ'ল:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

আশা করি এইটি কাজ করবে.


10

কিছুটা দেরি হলেও ... আমি একটি লিঙ্ক পেয়েছি যা আমি কয়েক বছর আগে সংরক্ষণ করেছি এবং আমি ভেবেছিলাম এটি আপনার পক্ষে কার্যকর হবে:

সিডিই: স্বয়ংক্রিয়ভাবে পোর্টেবল লিনাক্স অ্যাপ্লিকেশন তৈরি করুন

http://www.pgbovine.net/cde.html

  • কেবল প্রোগ্রামটি ডাউনলোড করুন
  • আর্গুমেন্ট হিসাবে বাইনারি পাসিং কার্যকর করুন বাইনারিটির নাম আপনি পোর্টেবল করতে চান, উদাহরণস্বরূপ: এনএম্যাপ

    ./cde_2011-08-15_64 বিট এনএম্যাপ

প্রোগ্রামটি এনএএমএপ এবং তার নির্ভরশীলদের সাথে লিঙ্কযুক্ত সমস্ত লিবিগুলি পড়বে এবং এটি সমস্তগুলি সিডি-প্যাকেজ / (আপনি যে একই ডিরেক্টরিতে আছেন) নামে একটি ফোল্ডারে সংরক্ষণ করবে ।

  • শেষ অবধি, আপনি ফোল্ডারটি সংকোচন করতে এবং যে কোনও সিস্টেমে পোর্টেবল বাইনারি স্থাপন করতে পারেন।

মনে রাখবেন, পোর্টেবল প্রোগ্রাম আরম্ভ করার জন্য আপনি অবস্থিত বাইনারি Exec আছে CDE-প্যাকেজ / nmap.cde

শুভেচ্ছান্তে


2
প্রশ্নের সঠিক উত্তর না দেওয়ার সময় - এটি সমস্যার একটি উল্লেখযোগ্য সমাধান।
রেজং

লিঙ্কটি এখন মারা গেছে বলে মনে হচ্ছে।
সিনান

0

জিসিসি-তে এটি সমর্থিত নয়। আসলে, আমি অবগত যে কোনও বিদ্যমান সংকলক / লিঙ্কারে এটি সমর্থিত নয়।


4
আপনি কী ব্যাখ্যা করতে পারবেন যে স্থায়ী লিঙ্কগুলি কোনও বিদ্যমান সংকলক দ্বারা সমর্থনযোগ্য নয়?
jwww

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