• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Solved]Output vom nm command

Hallo Forum!

Ich habe versucht mich in das Kapital nm und der dazugehoerigen Symboltabelle einzulesen.
Habe es auch an einem Hello World Programm getestet.

Jetzt wuerde mich gerne interessieren, was mir die einzelnen Werte in etwa wiedergeben?

Kann mir da jemand eventuell ein wenig helfen oder versuchen es ein wenig zu erklaeren bzw. vll. eine Quellenangabe?

Ich habe das Programm durch ein kill -3 abgebrochen, um ein Core Dump File zu erzeugen!

Nach welchen Variablen oder Objekten kann man suchen, um einen etwaigen Problem auf die Schliche zu kommen?

Grund ist jener, dass ein Programm des oefteren ein Core Dump mit einem Segmentation Fault erzeugt und ich wollte nun einmal rausfinden, woran das liegen kann?

Wenn mir jemand vll. ein paar Tipps geben kann, wonach man am besten sucht oder worauf man achten sollte?

Danke vielmals!
 
A

Anonymous

Gast
byron1778 schrieb:
Grund ist jener, dass ein Programm des oefteren ein Core Dump mit einem Segmentation Fault erzeugt und ich wollte nun einmal rausfinden, woran das liegen kann?
Was hast du denn bisher für Erfahrungen zB mit selbst programmieren und Debugger wie zB gdb , (nicht nur grafisch, sondern auch auf der Konsole) ??? Hast du zu diesem Programm den Quellcode ??? Welche Programmiersprache ???
Oft bei diese Fehler , Zugriff auf nicht initialisierte Zeiger, oder Fehler beim Umgang mit Arrays

robi
 
Erfahrung mit gdb und adb auf der Konsole habe ich.
Den Quellcode zu dem Programm habe ich leider nicht, da es von einer anderen Firma kommt.
Ich schaetze, dass das Programm in C geschrieben wurde, aber wirklich sagen kann ich es nicht!
Dass es ein Fehler sein kann mit falsch verwendeten Arrays haette ich mir auch gedacht, da sowas ja bei C und den Arrays des oefteren vorkommt.

Der komplete Output ist leider zu lange, ich habe ihn deswegen stark verkuerzt und nur das Ende gepostet!

Mich wuerde interessieren, wo man Infos bzgl. der einzelnen Abkuerzungen vll. bekommen kann, bzw. was die einem genau sagen, wie man sie interpretieren kann, solche Sachen!

Danke vielmals!

Code:
[74]    |         0|       0|FILE |LOCL |0    |ABS    |mqueue.c

[112]   |     91720|       4|OBJT |LOCL |0    |18     |name_max

[280]   |      9772|      12|FUNC |WEAK |0    |10     |nanosleep

[111]   |     91712|       6|OBJT |LOCL |0    |18     |objroot

[270]   |         0|       0|FUNC |GLOB |0    |UNDEF  |open64

[218]   |         0|       0|FUNC |GLOB |0    |UNDEF  |pathconf

[100]   |         0|       0|FILE |LOCL |0    |ABS    |pos4.c

[106]   |         0|       0|FILE |LOCL |0    |ABS    |pos4obj.c

[232]   |         0|       0|FUNC |GLOB |0    |UNDEF  |priocntl

[326]   |         0|       0|FUNC |GLOB |0    |UNDEF  |pthread_setcancelstate

[305]   |         0|       0|FUNC |GLOB |0    |UNDEF  |rmdir

[135]   |     92008|      60|OBJT |LOCL |0    |21     |rt_class

[131]   |     91824|       4|OBJT |LOCL |0    |21     |rt_dptbl

[203]   |     18848|     232|FUNC |GLOB |0    |10     |sched_get_priority_max

[291]   |     19080|     232|FUNC |GLOB |0    |10     |sched_get_priority_min

[354]   |     17736|     348|FUNC |GLOB |0    |10     |sched_getparam

[258]   |     18540|     288|FUNC |GLOB |0    |10     |sched_getscheduler

[273]   |     19312|     220|FUNC |GLOB |0    |10     |sched_rr_get_interval

[353]   |     17368|     368|FUNC |GLOB |0    |10     |sched_setparam

[217]   |     18084|     456|FUNC |GLOB |0    |10     |sched_setscheduler

[246]   |     18828|      20|FUNC |GLOB |0    |10     |sched_yield

[119]   |         0|       0|FILE |LOCL |0    |ABS    |sched.c

[274]   |     20460|     160|FUNC |WEAK |0    |10     |sem_close

[230]   |     20884|      72|FUNC |WEAK |0    |10     |sem_destroy

[323]   |     21364|      44|FUNC |WEAK |0    |10     |sem_getvalue

[281]   |     20816|      68|FUNC |WEAK |0    |10     |sem_init

[155]   |     20764|      52|FUNC |LOCL |0    |10     |sem_invalid

[311]   |     19532|     928|FUNC |WEAK |0    |10     |sem_open

[199]   |     20956|      72|FUNC |WEAK |0    |10     |sem_post

[293]   |     21188|      88|FUNC |WEAK |0    |10     |sem_reltimedwait_np

[201]   |     21100|      88|FUNC |WEAK |0    |10     |sem_timedwait

[325]   |     21276|      88|FUNC |WEAK |0    |10     |sem_trywait

[260]   |     20620|     144|FUNC |WEAK |0    |10     |sem_unlink

[233]   |     21028|      72|FUNC |WEAK |0    |10     |sem_wait

[139]   |         0|       0|FILE |LOCL |0    |ABS    |sem.c

[144]   |     91728|       4|OBJT |LOCL |0    |18     |semheadp

[145]   |     91736|      24|OBJT |LOCL |0    |18     |semlock

[202]   |     21408|     268|FUNC |GLOB |0    |10     |shm_open

[254]   |     21676|     144|FUNC |GLOB |0    |10     |shm_unlink

[156]   |         0|       0|FILE |LOCL |0    |ABS    |shm.c

[207]   |     21848|      20|FUNC |WEAK |0    |10     |sigqueue

[170]   |         0|       0|FILE |LOCL |0    |ABS    |sigrt.c

[250]   |     21836|      12|FUNC |WEAK |0    |10     |sigtimedwait

[261]   |     21820|      16|FUNC |WEAK |0    |10     |sigwaitinfo

[231]   |         0|       0|FUNC |GLOB |0    |UNDEF  |sleep

[247]   |         0|       0|FUNC |GLOB |0    |UNDEF  |snprintf

[313]   |         0|       0|FUNC |GLOB |0    |UNDEF  |strcat

[220]   |         0|       0|FUNC |GLOB |0    |UNDEF  |strchr

[310]   |         0|       0|FUNC |GLOB |0    |UNDEF  |strcmp

[355]   |         0|       0|FUNC |GLOB |0    |UNDEF  |strcpy

[186]   |         0|       0|FUNC |GLOB |0    |UNDEF  |strlen

[340]   |         0|       0|FUNC |GLOB |0    |UNDEF  |strrchr

[176]   |         0|       0|OBJT |GLOB |0    |ABS    |SUNW_0.7

[298]   |         0|       0|OBJT |GLOB |0    |ABS    |SUNW_1.1

[300]   |         0|       0|OBJT |GLOB |0    |ABS    |SUNW_1.2

[304]   |         0|       0|OBJT |GLOB |0    |ABS    |SUNW_1.3

[308]   |         0|       0|OBJT |GLOB |0    |ABS    |SUNW_1.4

[266]   |         0|       0|OBJT |GLOB |0    |ABS    |SUNWprivate_1.1

[133]   |     91888|      60|OBJT |LOCL |0    |21     |sys_class

[303]   |      9700|      12|FUNC |WEAK |0    |10     |timer_create

[307]   |      9712|      12|FUNC |WEAK |0    |10     |timer_delete

[213]   |      9724|      12|FUNC |WEAK |0    |10     |timer_getoverrun

[276]   |      9736|      12|FUNC |WEAK |0    |10     |timer_gettime

[228]   |      9748|      12|FUNC |WEAK |0    |10     |timer_settime

[134]   |     91948|      60|OBJT |LOCL |0    |21     |ts_class

[219]   |         0|       0|FUNC |GLOB |0    |UNDEF  |unlink

[55]    |         0|       0|FILE |LOCL |0    |ABS    |values-Xa.c
 
A

Anonymous

Gast
byron1778 schrieb:
Den Quellcode zu dem Programm habe ich leider nicht, da es von einer anderen Firma kommt.
Ich schaetze, dass das Programm in C geschrieben wurde, aber wirklich sagen kann ich es nicht!

Ups :???: soweit hab ich mich lange nicht mehr rausgewagt
nm brauch ich nur hin und wiedermal um zu schauen, was da so für Funktionen usw drin sind, meistens bei der Suche in Librarys. Dazu reicht mir aber die Manpage http://linux.die.net/man/1/nm

Wüsste jetzt auf die Schnelle auch nicht wo Infos und Beispiele für binutils gebündelt (möglichst noch gut beschrieben) zu finden währen, müsste wohl hier auch im Urschleim anfangen. Aber ich würde wohl die Infos ehr beim Befehlen ld und ar suchen. So richtig weiterhelfen kann ich dir da aber auch nicht.

robi
 
Macht ueberhaupt nichts.
Mich haette nur interessiert, was man so alles rauslesen kann aus dem Output bzw. worauf man achten muss.
Aber ich werde es einfach an einem "Hello, World" Programm durchexerzieren.
Danke jedenfalls fuer Deine Hilfe!
 
Ohne Quellcode ist da relativ wenig zu machen:

Bei C-Programmen kompiliert man diese mit
Code:
gcc -g program.c
Dann wird der Quellcode mit in die ausführbare Datei geschrieben.
Dann kann man sich z.B. mit "kdbg" ansehen, was beim Ausführen passiert, bzw. man kann das Ausführen anhalten und sehen, an welcher Stelle der Code gerade abgearbeitet wird.
Wenn das Programm aber nicht mit "-g" kompiliert ist, kann man auch nichts sehen, bzw. nur auf der Assemblerebene (Stichworte "Reverse Engineering", "Decompiling", "Hacking").
Speicherzugriffsfehler so zu beheben, würde ich für schwierig halten.
"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." (Kernighan)
:mrgreen:

Viele Grüße
 
A

Anonymous

Gast
Man kann schon mit einem core was anfangen, aber wenn nicht alle Informationen mit in das binary gepackt sind und ohne Quellcode wirds verdammt schwierig .
Code:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{ int *nullpointer;
  printf("Hello, world!\n");
  nullpointer[1]=100;

  return EXIT_SUCCESS;
}
compiliert mit vollen Debuginfos
gcc -g -o hallo hallo.c
......
kommt selbstverständlich beim Ausführen zum Fehler.
Das Programm dann mit dem core zusammen in den gdb laden und dort kann man den Fehler auch sauber aufspühren
Code:
rob@priv0001:~/hallo/src> gdb hallo -c core.26591
.........
Core was generated by `/home/rob/hallo/src/hallo'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483d7 in main () at hallo.c:11
11        nullpointer[1]=100;
(gdb) p nullpointer
$1 = (int *) 0xb7f02810
(gdb) p *nullpointer[1]
Cannot access memory at address 0xb7f02814

robi
 
Danke Euch vielmals für die Infos.
Nur eine letzte Frage an abgdf:

Was ich so weiss und auch schon öfters gehört habe ist, dass es nicht möglich ist C Code mittels Reverse Engineering wiederzubekommen?
Java war kein Problem bis jetzt, aber C soll angeblich nicht möglich sein.

Hat sich da jetzt was plötzlich geändert? :???:

Danke vielmals für die Infos!

lG
 
A

Anonymous

Gast
byron1778 schrieb:
Was ich so weiss und auch schon öfters gehört habe ist, dass es nicht möglich ist C Code mittels Reverse Engineering wiederzubekommen?
möglich ist das schon, nur bekommst du einen furchtbaren Pseudocode dabei heraus den kein Mensch je versteht, aber den kannst du wiederum wieder zum Programm compilieren. Wenn du einen so entstandenen C-Code einigermaßen verstehen willst, dann kannst du gleich das Programm neu schreiben, das geht schneller. Kleine Änderungen oder Korrekturen sollten aber dennoch in vielen Fällen durchaus möglich sein. Aber Achtung: ist bei den meisten Programmen durch deren Rechte die du bestätigt hast, streng verboten.

robi
 
Ok, danke Dir vielmals!

Dann werde ich das einmal bei einem selbstgeschriebenen Programm ausprobieren.
Bei Java war es absolut kein Problem.

Danke vielmals!
 
A

Anonymous

Gast
Hat mich selbst mal wieder interessiert, also mal schnell den erstbesten C Decompiler runtergeladen und zum Laufen gebracht.
also das Hello-Progrämmchen mit dem Fehler von oben aus der Binärdatei ohne Debuginfos recompiliert
Code:
// address: 0x80483b4
int main(int argc, char *argv[], char *envp[]) {
    puts("Hello, world!");
    *(__size32*)(local0 + 4) = 100;
    return 0;
}
Beim compilieren dann
Code:
priv0001:/home/rob/hallo/src/testfile/hallo # gcc -o hallo hallo.c
hallo.c: In function ‘main’:
hallo.c:4: error: ‘__size32’ undeclared (first use in this function)
hallo.c:4: error: (Each undeclared identifier is reported only once
hallo.c:4: error: for each function it appears in.)
hallo.c:4: error: expected expression before ‘)’ token
hallo.c:4: error: ‘local0’ undeclared (first use in this function)
Aber gut, das hatte man als geübter C-Programmierer in 2 Minuten auch behoben, fehlen einfach die Header, aber das mit dem Zeiger da müsste man trotzdem schon mal draufkommen, was das ursprüngelich mal gewesen sein sollte. :???:



robi.
 
Hallo!

Folgendes konnte ich dem Core File noch entnehmen und dem Programm, welches sich da gelegentlich mal verabschiedet

Code:
gdb /reuters/mlip/RTRmlip/bin/dcdm /var/core/core.dcdm.1228300802
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "sparc-sun-solaris2.10"...
Reading symbols from /reuters/SOFTWARE/RTRmlip.2.1.4.4.sol10.sparc/RTRmlip/lib/libtibhawkamicpp.so...done.
Loaded symbols for /reuters/mlip/RTRmlip/lib/libtibhawkamicpp.so
Reading symbols from /reuters/SOFTWARE/RTRmlip.2.1.4.4.sol10.sparc/RTRmlip/lib/libtibhawkami.so...done.
Loaded symbols for /reuters/mlip/RTRmlip/lib/libtibhawkami.so
Reading symbols from /reuters/SOFTWARE/RTRmlip.2.1.4.4.sol10.sparc/RTRmlip/lib/libtibrv.so...done.
Loaded symbols for /reuters/mlip/RTRmlip/lib/libtibrv.so
Reading symbols from /lib/libgen.so.1...done.
Loaded symbols for /lib/libgen.so.1
Reading symbols from /lib/libsocket.so.1...done.
Loaded symbols for /lib/libsocket.so.1
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/librt.so.1...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libpthread.so.1...
warning: Lowest section in /lib/libpthread.so.1 is .dynamic at 00000074
done.
Loaded symbols for /lib/libpthread.so.1
Reading symbols from /usr/lib/libCstd.so.1...done.
Loaded symbols for /usr/lib/libCstd.so.1
Reading symbols from /usr/lib/libCrun.so.1...done.
Loaded symbols for /usr/lib/libCrun.so.1
Reading symbols from /lib/libm.so.2...done.
Loaded symbols for /lib/libm.so.2
Reading symbols from /lib/libthread.so.1...
warning: Lowest section in /lib/libthread.so.1 is .dynamic at 00000074
done.
Loaded symbols for /lib/libthread.so.1
Reading symbols from /lib/libc.so.1...done.
Loaded symbols for /lib/libc.so.1
Reading symbols from /lib/libkstat.so.1...done.
Loaded symbols for /lib/libkstat.so.1
Reading symbols from /usr/lib/libkvm.so.1...done.
Loaded symbols for /usr/lib/libkvm.so.1
Reading symbols from /lib/libaio.so.1...done.
Loaded symbols for /lib/libaio.so.1
Reading symbols from /lib/libmd.so.1...done.
Loaded symbols for /lib/libmd.so.1
Reading symbols from /lib/libelf.so.1...done.
Loaded symbols for /lib/libelf.so.1
Reading symbols from /usr/lib/cpu/sparcv8plus/libCstd_isa.so.1...done.
Loaded symbols for /usr/lib/cpu/sparcv8plus/libCstd_isa.so.1
Reading symbols from /platform/SUNW,Sun-Fire-V240/lib/libc_psr.so.1...done.
Loaded symbols for /platform/SUNW,Sun-Fire-V240/lib/libc_psr.so.1
Reading symbols from /lib/nss_files.so.1...done.
Loaded symbols for /lib/nss_files.so.1
Reading symbols from /lib/ld.so.1...done.
Loaded symbols for /lib/ld.so.1
Core was generated by `/reuters/mlip/RTRmlip/bin/dcdm -d -s 104857600 -n 9 -r 2'.
Program terminated with signal 11, Segmentation fault.
#0  0x000ca024 in __1cPConflationQdDueuePgetTTLDeadItems6MrnDstdGvector4CpnMConflatedMsg_n0BJallocator4C3_____v_ ()

Vll. hilft das ja jemanden noch etwas?

Mir faellt das Warning auf, aber wird letzten Endes mit einem done geschlossen...
 
Oben