Do dynamic libraries have the same virtual memory address in all programs?When to use dynamic vs. static librariesHow to translate a virtual memory address to a physical address?Dynamic linking: offset value used to index relocation tableVirtual address space vs virtual memoryWhere virtual memory addresses reside?Understanding Virtual Address, Virtual Memory and PagingLLDB Terminal OutputVirtual Address to Physical addressFinding virtual memory address of variable on osxVirtual Memory, Virtual Address
What is the line crossing the Pacific Ocean that is shown on maps?
Alphabet completion rate
How can I convince my reader that I will not use a certain trope?
MH370 blackbox - is it still possible to retrieve data from it?
Is there a short way to compare many values mutually at same time without using multiple 'and's?
Intuitively, why does putting capacitors in series decrease the equivalent capacitance?
Find smallest index that is identical to the value in an array
Calculating the partial sum of a expl3 sequence
Every infinite linearly ordered set has two disjoint infinite subsets
Why do some games show lights shine through walls?
Does squid ink pasta bleed?
Is there a maximum distance from a planet that a moon can orbit?
Cascading Repair Costs following Blown Head Gasket on a 2004 Subaru Outback
Why is C++ initial allocation so much larger than C's?
Short story with brother-sister conjoined twins as protagonists?
What do you call the action of someone tackling a stronger person?
Why aren't (poly-)cotton tents more popular?
Architecture of networked game engine
A player is constantly pestering me about rules, what do I do as a DM?
How could mana leakage be dangerous to a elf?
Counting occurrence of words in table is slow
When is it ok to add filler to a story?
How risky is real estate?
Going to get married soon, should I do it on Dec 31 or Jan 1?
Do dynamic libraries have the same virtual memory address in all programs?
When to use dynamic vs. static librariesHow to translate a virtual memory address to a physical address?Dynamic linking: offset value used to index relocation tableVirtual address space vs virtual memoryWhere virtual memory addresses reside?Understanding Virtual Address, Virtual Memory and PagingLLDB Terminal OutputVirtual Address to Physical addressFinding virtual memory address of variable on osxVirtual Memory, Virtual Address
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
When a library is dynamically linked to a program does it have the same address in that program as in any other program?
I my head I imagined each process gets the whole of the address space and then everything in that process (inc. dynamic libraries that are already in memory) gets mapped to semi-random parts of it because of ASLR.
But I did a short experiment that seems to imply that the address of libraries that are in memory are fixed across different processes and thus reusable across programs? Is that correct?
I wrote two short c programs which used the "sleep" function. In one I printed out the address of the sleep function and in the second I assigned a function pointer to that address. I ran them both and the sleep function worked in both.
#include <stdio.h>
#include <unistd.h>
int main()
while(1)
printf("%sn", &"hi");
sleep(2);
printf("pointer to sleep: %pn", sleep);
#include <stdio.h>
#include <unistd.h>
#define sleepagain ((void (*)(int))0x7fff7652e669) //addr of sleep from first program
int main()
while(1)
printf("%sn", &"test");
sleepagain(2);
I wasn't sure what this would show but what it actually showed was a) the address was the same every time I ran the first program and b) that sleep still functioned when I ran the second.
I think I understand how this works but I am curious if it has to work the way it does and what are the reasons behind it?
Just to reference the answer I got already when I took a look with otool -IvV
I got:
a.out:
Indirect symbols for (__TEXT,__stubs) 2 entries
address index name
0x0000000100000f62 2 _printf
0x0000000100000f68 3 _sleep
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 4 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__got) 1 entries
address index name
0x0000000100001010 3 _sleep
Indirect symbols for (__DATA,__la_symbol_ptr) 2 entries
address index name
0x0000000100001018 2 _printf
0x0000000100001020 3 _sleep
Which is also what the indirect address was in lldb. The address was the address of sleep itself:
Process 11209 launched: 'stuff/a.out' (x86_64)
hi
Process 11209 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff7652e669 libsystem_c.dylib`sleep
libsystem_c.dylib`sleep:
-> 0x7fff7652e669 <+0>: push rbp
0x7fff7652e66a <+1>: mov rbp, rsp
0x7fff7652e66d <+4>: push rbx
0x7fff7652e66e <+5>: sub rsp, 0x28
Target 0: (a.out) stopped.
For some additional info:
$ otool -hv a.out
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 15 1296 NOUNDEFS DYLDLINK TWOLEVEL PIE
macos dynamic-linking virtual-address-space
add a comment |
When a library is dynamically linked to a program does it have the same address in that program as in any other program?
I my head I imagined each process gets the whole of the address space and then everything in that process (inc. dynamic libraries that are already in memory) gets mapped to semi-random parts of it because of ASLR.
But I did a short experiment that seems to imply that the address of libraries that are in memory are fixed across different processes and thus reusable across programs? Is that correct?
I wrote two short c programs which used the "sleep" function. In one I printed out the address of the sleep function and in the second I assigned a function pointer to that address. I ran them both and the sleep function worked in both.
#include <stdio.h>
#include <unistd.h>
int main()
while(1)
printf("%sn", &"hi");
sleep(2);
printf("pointer to sleep: %pn", sleep);
#include <stdio.h>
#include <unistd.h>
#define sleepagain ((void (*)(int))0x7fff7652e669) //addr of sleep from first program
int main()
while(1)
printf("%sn", &"test");
sleepagain(2);
I wasn't sure what this would show but what it actually showed was a) the address was the same every time I ran the first program and b) that sleep still functioned when I ran the second.
I think I understand how this works but I am curious if it has to work the way it does and what are the reasons behind it?
Just to reference the answer I got already when I took a look with otool -IvV
I got:
a.out:
Indirect symbols for (__TEXT,__stubs) 2 entries
address index name
0x0000000100000f62 2 _printf
0x0000000100000f68 3 _sleep
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 4 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__got) 1 entries
address index name
0x0000000100001010 3 _sleep
Indirect symbols for (__DATA,__la_symbol_ptr) 2 entries
address index name
0x0000000100001018 2 _printf
0x0000000100001020 3 _sleep
Which is also what the indirect address was in lldb. The address was the address of sleep itself:
Process 11209 launched: 'stuff/a.out' (x86_64)
hi
Process 11209 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff7652e669 libsystem_c.dylib`sleep
libsystem_c.dylib`sleep:
-> 0x7fff7652e669 <+0>: push rbp
0x7fff7652e66a <+1>: mov rbp, rsp
0x7fff7652e66d <+4>: push rbx
0x7fff7652e66e <+5>: sub rsp, 0x28
Target 0: (a.out) stopped.
For some additional info:
$ otool -hv a.out
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 15 1296 NOUNDEFS DYLDLINK TWOLEVEL PIE
macos dynamic-linking virtual-address-space
add a comment |
When a library is dynamically linked to a program does it have the same address in that program as in any other program?
I my head I imagined each process gets the whole of the address space and then everything in that process (inc. dynamic libraries that are already in memory) gets mapped to semi-random parts of it because of ASLR.
But I did a short experiment that seems to imply that the address of libraries that are in memory are fixed across different processes and thus reusable across programs? Is that correct?
I wrote two short c programs which used the "sleep" function. In one I printed out the address of the sleep function and in the second I assigned a function pointer to that address. I ran them both and the sleep function worked in both.
#include <stdio.h>
#include <unistd.h>
int main()
while(1)
printf("%sn", &"hi");
sleep(2);
printf("pointer to sleep: %pn", sleep);
#include <stdio.h>
#include <unistd.h>
#define sleepagain ((void (*)(int))0x7fff7652e669) //addr of sleep from first program
int main()
while(1)
printf("%sn", &"test");
sleepagain(2);
I wasn't sure what this would show but what it actually showed was a) the address was the same every time I ran the first program and b) that sleep still functioned when I ran the second.
I think I understand how this works but I am curious if it has to work the way it does and what are the reasons behind it?
Just to reference the answer I got already when I took a look with otool -IvV
I got:
a.out:
Indirect symbols for (__TEXT,__stubs) 2 entries
address index name
0x0000000100000f62 2 _printf
0x0000000100000f68 3 _sleep
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 4 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__got) 1 entries
address index name
0x0000000100001010 3 _sleep
Indirect symbols for (__DATA,__la_symbol_ptr) 2 entries
address index name
0x0000000100001018 2 _printf
0x0000000100001020 3 _sleep
Which is also what the indirect address was in lldb. The address was the address of sleep itself:
Process 11209 launched: 'stuff/a.out' (x86_64)
hi
Process 11209 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff7652e669 libsystem_c.dylib`sleep
libsystem_c.dylib`sleep:
-> 0x7fff7652e669 <+0>: push rbp
0x7fff7652e66a <+1>: mov rbp, rsp
0x7fff7652e66d <+4>: push rbx
0x7fff7652e66e <+5>: sub rsp, 0x28
Target 0: (a.out) stopped.
For some additional info:
$ otool -hv a.out
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 15 1296 NOUNDEFS DYLDLINK TWOLEVEL PIE
macos dynamic-linking virtual-address-space
When a library is dynamically linked to a program does it have the same address in that program as in any other program?
I my head I imagined each process gets the whole of the address space and then everything in that process (inc. dynamic libraries that are already in memory) gets mapped to semi-random parts of it because of ASLR.
But I did a short experiment that seems to imply that the address of libraries that are in memory are fixed across different processes and thus reusable across programs? Is that correct?
I wrote two short c programs which used the "sleep" function. In one I printed out the address of the sleep function and in the second I assigned a function pointer to that address. I ran them both and the sleep function worked in both.
#include <stdio.h>
#include <unistd.h>
int main()
while(1)
printf("%sn", &"hi");
sleep(2);
printf("pointer to sleep: %pn", sleep);
#include <stdio.h>
#include <unistd.h>
#define sleepagain ((void (*)(int))0x7fff7652e669) //addr of sleep from first program
int main()
while(1)
printf("%sn", &"test");
sleepagain(2);
I wasn't sure what this would show but what it actually showed was a) the address was the same every time I ran the first program and b) that sleep still functioned when I ran the second.
I think I understand how this works but I am curious if it has to work the way it does and what are the reasons behind it?
Just to reference the answer I got already when I took a look with otool -IvV
I got:
a.out:
Indirect symbols for (__TEXT,__stubs) 2 entries
address index name
0x0000000100000f62 2 _printf
0x0000000100000f68 3 _sleep
Indirect symbols for (__DATA,__nl_symbol_ptr) 2 entries
address index name
0x0000000100001000 4 dyld_stub_binder
0x0000000100001008 ABSOLUTE
Indirect symbols for (__DATA,__got) 1 entries
address index name
0x0000000100001010 3 _sleep
Indirect symbols for (__DATA,__la_symbol_ptr) 2 entries
address index name
0x0000000100001018 2 _printf
0x0000000100001020 3 _sleep
Which is also what the indirect address was in lldb. The address was the address of sleep itself:
Process 11209 launched: 'stuff/a.out' (x86_64)
hi
Process 11209 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00007fff7652e669 libsystem_c.dylib`sleep
libsystem_c.dylib`sleep:
-> 0x7fff7652e669 <+0>: push rbp
0x7fff7652e66a <+1>: mov rbp, rsp
0x7fff7652e66d <+4>: push rbx
0x7fff7652e66e <+5>: sub rsp, 0x28
Target 0: (a.out) stopped.
For some additional info:
$ otool -hv a.out
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL LIB64 EXECUTE 15 1296 NOUNDEFS DYLDLINK TWOLEVEL PIE
macos dynamic-linking virtual-address-space
macos dynamic-linking virtual-address-space
edited Mar 25 at 13:04
AsksStupidQuestions
asked Mar 25 at 11:12
AsksStupidQuestionsAsksStupidQuestions
642 silver badges7 bronze badges
642 silver badges7 bronze badges
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
On macOS, many system libraries are part of the dyld shared cache. There's a machine-wide mapping. So, those libraries end up at the same address in all processes of the same architecture (32- or 64-bit).
The location of the dyld shared cache is randomized at system boot. So, library addresses will be the same from process to process until you reboot.
Not all system libraries are part of the cache, only the ones that Apple deems to be commonly loaded.
Libraries of your own or from third parties will be loaded at random locations each time they're loaded, assuming they are position-independent.
Try looking at the output from vmmap -v <pid>
. Look for the line with "machine-wide VM submap" and those that follow.
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
1
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
1
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55336505%2fdo-dynamic-libraries-have-the-same-virtual-memory-address-in-all-programs%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
On macOS, many system libraries are part of the dyld shared cache. There's a machine-wide mapping. So, those libraries end up at the same address in all processes of the same architecture (32- or 64-bit).
The location of the dyld shared cache is randomized at system boot. So, library addresses will be the same from process to process until you reboot.
Not all system libraries are part of the cache, only the ones that Apple deems to be commonly loaded.
Libraries of your own or from third parties will be loaded at random locations each time they're loaded, assuming they are position-independent.
Try looking at the output from vmmap -v <pid>
. Look for the line with "machine-wide VM submap" and those that follow.
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
1
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
1
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
add a comment |
On macOS, many system libraries are part of the dyld shared cache. There's a machine-wide mapping. So, those libraries end up at the same address in all processes of the same architecture (32- or 64-bit).
The location of the dyld shared cache is randomized at system boot. So, library addresses will be the same from process to process until you reboot.
Not all system libraries are part of the cache, only the ones that Apple deems to be commonly loaded.
Libraries of your own or from third parties will be loaded at random locations each time they're loaded, assuming they are position-independent.
Try looking at the output from vmmap -v <pid>
. Look for the line with "machine-wide VM submap" and those that follow.
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
1
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
1
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
add a comment |
On macOS, many system libraries are part of the dyld shared cache. There's a machine-wide mapping. So, those libraries end up at the same address in all processes of the same architecture (32- or 64-bit).
The location of the dyld shared cache is randomized at system boot. So, library addresses will be the same from process to process until you reboot.
Not all system libraries are part of the cache, only the ones that Apple deems to be commonly loaded.
Libraries of your own or from third parties will be loaded at random locations each time they're loaded, assuming they are position-independent.
Try looking at the output from vmmap -v <pid>
. Look for the line with "machine-wide VM submap" and those that follow.
On macOS, many system libraries are part of the dyld shared cache. There's a machine-wide mapping. So, those libraries end up at the same address in all processes of the same architecture (32- or 64-bit).
The location of the dyld shared cache is randomized at system boot. So, library addresses will be the same from process to process until you reboot.
Not all system libraries are part of the cache, only the ones that Apple deems to be commonly loaded.
Libraries of your own or from third parties will be loaded at random locations each time they're loaded, assuming they are position-independent.
Try looking at the output from vmmap -v <pid>
. Look for the line with "machine-wide VM submap" and those that follow.
answered Mar 25 at 15:13
Ken ThomasesKen Thomases
73.8k6 gold badges77 silver badges116 bronze badges
73.8k6 gold badges77 silver badges116 bronze badges
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
1
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
1
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
add a comment |
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
1
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
1
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
I had a go with my own dylib and yeah, each time it was loaded it was at a new location, if I kept it loaded (by running a program using it in an infinite loop) the addresses were the same and I could get it from other programs. Enjoying learning how this stuff works.
– AsksStupidQuestions
Mar 25 at 15:15
1
1
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
I would not expect keeping one process with it loaded would affect subsequent processes that load it.
– Ken Thomases
Mar 25 at 19:20
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
Hm, you're right, I guess I got fooled because the lowest two bytes of the address were the same.
– AsksStupidQuestions
Mar 25 at 19:53
1
1
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
Yeah, ASLR should only move stuff by increments of a page size (4096 a.k.a. 0x1000). So, it will never change the low three hex digits.
– Ken Thomases
Mar 25 at 20:03
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55336505%2fdo-dynamic-libraries-have-the-same-virtual-memory-address-in-all-programs%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown