Linux: Cum fac...?

Compilez un program. La sfarsit ar trebui sa fac un make install, dar as vrea sa salvez ce instaleaza pentru un alt sistem. Cum fac ca acel make install sa imi arate ce fisiere a instalat si unde, sau, mai bine, cum fac sa se "instaleze" intr-un director gol?

PS: Se presupune ca Makefile n-are optiunile astea.
PS2: Nu stiu sa editez Makefile.
PS3: Daca va ganditi la chroot, imi trebuie indicatii ca pentru mamaie, ca n-am mai facut pana acum.
 
Last edited:
Make install poate să facă absolut orice în spate, de la copiat "simplu" la rulat un alt script care face asta. Vezi dacă te ajută make -d, altfel... strace (cu trace=open,close), auditctl și alte chestii mai complicate (loggedfs). Da, sintaxa makefile e dubioasă și unii le fac super write-only, de nu mai înțelegi nimic, dar până la urmă tot aia e mai simplu :).
 
make -d merge. Noroc ca sunt doar 4 fisiere. Le-am cules manual de pe unde le-a aruncat.
Alta:
Compilez libtommath in Slackware 64bit. Imi rezulta libtommath.a in /usr/local/lib/ si nimic in /usr/local/lib64/
Sa inteleg ca acel libtommath.a este 32bit? Cum fac sa obtin 64bit?

Bah! Luni ma duc la serviciu! Cine mai are timp de Slackware? Slackware e exclusiv de weekend. :wink:
 
Vezi
Code:
objdump -f libtommath.a | grep ^architecture
pentru 32/64 bit.

Make compilează fără să se uite, pentru că ar trebui să configurezi tu gcc cum îți place (dacă biblioteca n-are un config al ei). By default pe o arhitectură 64-bit gcc ar trebui să aibă -m64 deja setat. Dacă ție-ți generează 32-bit pe o mașină 64-bit e cam ciudat, dar locul unde îl pune nu garantează că e 32-bit. Anyway, poți forța -m64 cu CFLAGS dacă e nevoie.
 
architecture: i386:x86-64. Ce sa inteleg? i386 sau x86-64?

Intre timp m-am apucat de altceva: sa compilez Firebird pe OpenWRT.
Am inceput direct cu ultimul alfa de pe site, ca are libtommath inclus si nu ma mai chinui. Culmea, pe Slackware pare sa mearga din prima! Am si reusit sa creez o baza de date si sa ma conectez la ea.
Da' pe OpenWRT nu vrea, ca OpenWRT n-are libicu-devel. Asadar, am purces la downloadat icu4c v60.2 de la mama lui.
Configurat - OK
Compilat - OK
Instalat - evident in directorul gresit, dar OK, l-am mutat din /usr/local in /usr
Apoi incerc ./configure la Firebird si nu merge. La sapatul prin log-uri rezulta chestiunea asta:
Code:
configure:19252: checking for main in -licuuc
configure:19271: gcc -o conftest     conftest.c -licuuc    >&5
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `__dynamic_cast@CXXABI_1.3'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `operator delete(void*)@GLIBCXX_3.4'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `__gxx_personality_v0@CXXABI_1.3'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `vtable for __cxxabiv1::__class_type_info@CXXABI_1.3'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info@CXXABI_1.3'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info@CXXABI_1.3'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `__cxa_pure_virtual@CXXABI_1.3'
/usr/lib/gcc/i486-openwrt-linux-musl/5.4.0/../../../libicuuc.so: undefined reference to `__cxa_call_unexpected@CXXABI_1.3'
collect2: error: ld returned 1 exit status
Deci ce naiba s-a intamplat aici?
 
i386:x86-64 e versiunea pe 64 bit.

/usr/local este directorul corect pentru aplicații instalate de utilizatori. /usr e pentru chestii care sunt instalate din pachete de OS. Diferențierea se face în primul rând ca să nu bușești chestii sistem cu lucruri prost compilate/linkate, cum se întâmplă cu firebird-ul ăla (pare dubioasă calea aia către lib).
 
1) OK. Deci "libicuuc.so: undefined reference to X" inseamna ca X lipseste din libicuuc.so sau din libc/uclibc?

2) Exista undeva un motor de cautare unde sa introduc PCI ID si sa imi zica ce module din kernel imi trebuie pentru acel device?
PS: am rulat deja lspci -k dar nu prea m-am lamurit prin anumite locuri.
 
Last edited:
Codul de aici e clar c++, n-am idee ce s-a compilat și cum. Cu objdump -p poți vedea lista de biblioteci necesare (cu grep pe NEEDED dacă-s multe, iar la version references îți zice și cam ce versiuni se așteaptă).
 
1) Faceam confuzie intre c si c++; nu mi-am dat seama ca sunt biblioteci diferite.
Deci am instalat libstdc++. Eroarea persista. Este ceva ciudat ca nu da eroare ca nu gaseste biblioteca ci anumite functii din ea. Sau asa sunt erorile in linux?
Code:
root@LEDE:/usr/lib# objdump -p libicuuc.so

libicuuc.so:     file format elf32-i386

Program Header:
    LOAD off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**12
         filesz 0x001d5bfd memsz 0x001d5bfd flags r-x
    LOAD off    0x001d6bd0 vaddr 0x001d7bd0 paddr 0x001d7bd0 align 2**12
         filesz 0x0000a56c memsz 0x0000bcb8 flags rw-
 DYNAMIC off    0x001e0e9c vaddr 0x001e1e9c paddr 0x001e1e9c align 2**2
         filesz 0x000000e8 memsz 0x000000e8 flags rw-
EH_FRAME off    0x0018c708 vaddr 0x0018c708 paddr 0x0018c708 align 2**2
         filesz 0x000065ec memsz 0x000065ec flags r--
   STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
         filesz 0x00000000 memsz 0x00000000 flags rw-
   RELRO off    0x001d6bd0 vaddr 0x001d7bd0 paddr 0x001d7bd0 align 2**0
         filesz 0x0000a430 memsz 0x0000a430 flags r--

Dynamic Section:
  NEEDED               libicudata.so.60
  NEEDED               libstdc++.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so
  SONAME               libicuuc.so.60
  SYMBOLIC             0x00000000
  INIT                 0x00042978
  FINI                 0x001431fa
  HASH                 0x000000f4
  STRTAB               0x0001344c
  SYMTAB               0x0000581c
  STRSZ                0x00022813
  SYMENT               0x00000010
  PLTGOT               0x001e2000
  PLTRELSZ             0x00000220
  PLTREL               0x00000011
  JMPREL               0x00042758
  REL                  0x00037858
  RELSZ                0x0000af00
  RELENT               0x00000008
  VERNEED              0x000377e8
  VERNEEDNUM           0x00000002
  VERSYM               0x00035c60
  RELCOUNT             0x000014c4

Version References:
  required from libstdc++.so.6:
    0x056bafd3 0x00 05 CXXABI_1.3
    0x0bafd178 0x00 04 CXXABI_1.3.8
    0x08922974 0x00 03 GLIBCXX_3.4
  required from libgcc_s.so.1:
    0x0d696910 0x00 06 GLIBC_2.0
    0x0b792650 0x00 02 GCC_3.0

root@LEDE:/usr/lib# ls -l | egrep "libu|libstd"
lrwxrwxrwx    1 root     root            19 Feb 21 20:12 libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x    1 root     root       1110467 Oct 18 08:54 libstdc++.so.6.0.21
-rw-r--r--    1 root     root          2644 Oct 18 08:54 libstdc++.so.6.0.21-gdb.py
-rwxr-xr-x    1 root     root        167939 Dec 24 14:05 libuClibc++-0.2.4.so
lrwxrwxrwx    1 root     root            20 Mar 12 21:36 libuClibc++.so.0 -> libuClibc++-0.2.4.so
 
Mda. Buna intrebare. Dar chiar are nevoie de bibilioteca propriu-zisa sau doar de headere?

In sfarsit, am constatat ca pot instala pachetul ICU de la LEDE si headerele aceleiasi versiuni (58) de pe subversion. Si cu combinatia asta, trece de ICU.

LE:
Nu merge. Am dat peste alte doua erori obscure si nici macar n-am ajuns la compilare.

Varianta 1: Mai incerc OpenWRT + Firebird
Avantaje: Un SO usor administrabil de la distanta si o baza de date mai obscura si mai putin predispusa la a fi atacata de boti.
Dezavantaje: Nu merge!

Varianta 2: OpenWRT + MySQL
Avantaje: SO usor administrabil, baza de date gata de lucru (sper).
Dezavantaje: 2 zile de munca la modificat programul, diverse probleme cu mysql care vor aparea inevitabil, probleme de compatibilitate la fiecare update viitor.

Varianta 3: Slackware + Firebird
Avantaje: Stiu deja ca merge si imi place. Inca are init! :biggrin: Posibil compatibilitate mai buna pentru x86-64, power management, driveri, hdd, etc. Invat ceva nou.
Dezavantaje: Administrarea e criminala comparativ cu OpenWRT si e posibil sa fac gafe de securitate majore.

Voi ce ati alege?
 
Fain cum reușești tu să alegi întotdeauna cele mai dubioase metode de a rezolva o problemă :smile:.

De când am citit post-ul tău am downloadat și instalat un OS (linux mint) și am instalat Firebird în el.

fireb.png

Da, dacă stai să compilezi tu și să folosești OS-uri făcute pentru cu totul altceva, da, o să ai probleme unice, pe care trebuie să ți le rezolvi.
 
Eu încă încerc sa înțeleg logica din a instala o aplicație de baze de date pe un OpenWRT. :what:
Acu dacă îmi spune ca acel OpenWRT e instalat pe un router, chiar ma da pe spate.
 
Nu. E pe un mini-PC cu i5-4200U, forever headless, ca n-are decat HDMI. Logica, asa cum am zis mai sus, e ca OpenWRT este simplu de administrat remote, iar LUCI (interfata web din OpenWRT) nu merge pe altceva.

Sa inteleg ca toata lumea sustine varianta Slackware?
 
Interfața de administrare facilă este pentru 1) noobi care altfel n-ar cumpăra produsul (gen, router sau alt fel de appliance care necesită cel puțin un first-time config), sau 2) cazurile în care activitatea de administrare/monitorizare este o chestie foaaaaarte frecventă. Mă cam îndoiesc că sistemul ăsta bifează vreuna dintre opțiuni.

Mă bucur că Slackware mai există, era miez acu' 20 de ani când încă se scria în Chip despre el. Io în locul tău m-aș băga pe care distribuție linux e mai bine întreținută, ca să am actualizări foarte recente și informații gârlă. De exemplu, un CentOS 7 minimal install + un tutorial bun de server hardening, și pe care să intru o dată pe lună prin SSH să verific jurnale și să dau un yum update. CentOS e suficient de prietenos cu începătorii, suficient de răspândit în lumea serverelor ca să ai instrucțiuni pe partea de securitate/configurare/performanță etc., suficient de bine suportat de RedHat pentru ca să ai ceva garanții de responsabilitate la calitate.

Iar peste ăsta aș pune un MariaDB cu phpMyAdmin dacă chiar vreau neapărat interfață de administrare la baza de date.

Apoi aș face cel puțin un sistem paralel pentru dezvoltare și testare, cât mai apropiat ca și configurare - poate fi mașină virtuală pe alt PC, n-are importanță, doar să nu trebuiască să faci dezvoltare și experimente pe sistemul de producție.
 
Last edited:
Dude, dafuq?! Ai ajuns sa compilezi aplicatii din sursa si te plangi de administrare?
Pune in puii mei o distributie serioasa (Debian/Ububtu/CentOS/Slack) cu manager de pachete + MySQL/MariaDB+ PHP + PhpMyAdmin. Pentru administrare din web exista Webmin (nu l-am mai folosit de ~ 10 ani asa ca nu pot sa-ti spun cum e) sau daca chiar te consideri n00b, pune o interfata grafica + xrdp.
In timpul pe care l-ai pierdut compiland diverse, faceai toate astea lejer. Gandeste-te ca la orice problema aparuta gasesti tone de documentatie/posturi simulare pe net.
 
Back
Top