Re: argv
- From: David Marceau <uticdmarceau2007 yahoo ca>
- To: gtk-app-devel-list gnome org
- Subject: Re: argv
- Date: Tue, 12 Apr 2016 07:58:03 -0400
Taken from an older gtk tutorial, but nevertheless should apply to your
situation:
http://www.gtk.org/tutorial1.2/gtk_tut-2.html
#include <gtk/gtk.h>
int main( int argc,
char *argv[] )
{
GtkWidget *window;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<
//DID YOU INTRODUCE THIS LINE IN YOUR CODE?
gtk_init (&argc, &argv);
//>>>>>>>>>>>>>>>>>>>>>>>>>
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return(0);
}
"Here is our gtk_init again. As before, this initializes the toolkit,
and parses the arguments found on the command line. Any argument it
recognizes from the command line, it removes from the list, and modifies
argc and argv to make it look like they never existed, allowing your
application to parse the remaining arguments.
gtk_init (&argc, &argv);
"
DID YOU CATCH THAT LAST PART? It grabs any arguments that are gtk
specific and removes them. The leftover arguments are left within the
argv array. Did you call gtk_init? Did you pass any non-GTK-switch
arguments to your app? If not, it would explain why your argsv holds
empty/uninitialized values.
If you really need to resort to assembler, just run the gcc/g++ compiler
with the "-c -S" to generate the assembler to see how they gcc compiler
does it with the above gtkhello.c
THIS IS THE ENVIRONMENT SETUP ON DEBIAN LINUX:
pkg-config --cflags --libs gtk+-2.0
-pthread -I/usr/include/gtk-2.0
-I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/
-I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0
-I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12
-I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12
-I/usr/include/pango-1.0 -I/usr/include/harfbuzz
-I/usr/include/pango-1.0 -I/usr/include/glib-2.0
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2
-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo
-lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0
-lglib-2.0 -lfontconfig -lfreetype
THIS IS TO COMPILE THE ABOVE GTKHELLO
gcc gtkhello.c `pkg-config --cflags --libs gtk+-2.0`
THIS IS TO GENERATE THE ASSEMBLER FOR GTKHELLO
gcc -S gtkhello.c `pkg-config --cflags --libs gtk+-2.0`
cat gtkhello.s
.file "gtkhello.c"
.text
.globl main
.type main, @function
main:
.LFB206:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
leaq -32(%rbp), %rdx
leaq -20(%rbp), %rax
movq %rdx, %rsi
movq %rax, %rdi
call gtk_init
movl $0, %edi
call gtk_window_new
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movq %rax, %rdi
call gtk_widget_show
call gtk_main
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE206:
.size main, .-main
.ident "GCC: (Debian 5.3.1-14) 5.3.1 20160409"
.section .note.GNU-stack,"",@progbits
Cheers,
David Marceau
On 04/09/2016 09:39 PM, Andrew Robinson wrote:
This should be easy, but it is not. I am writing an assembly language program
involving GTK+. I want to parse the command line for options but am unable to
do so. The code to find argv and argc is simple:
main:
push ebp
mov ebp, esp
lea eax, [ebp + 12]
lea ecx, [ebp + 8]
The problem is that [ebp + 12] and [ebp + 8] point to nonsense. I ran a
debugger and looked at the stack, and there is nothing else on the stack
except for ebp, rtn addr, and these two parameters. I even tried
daisy-chaining the addresses to see where they would lead, and they are not
even close to pointing to the actual command line. I can easily find the
command line using a memory search, so I know what address it should be. What
am I doing wrong here? I have:
Gtk3+
Win32
v3.18.3.0
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]