|
Thanks Rajkumar,
I want to learn more about,
1. what are in import library files;
2. how it solves the address at load time.
Any more description or recommended reading please?
regards,
George
|
|
|
|
|
[^] gives the idea i think.
|
|
|
|
|
Thanks Rajkumar,
I have read the link before. My question is,
--------------------
If func1 exists in another DLL, the linker can't resolve this directly because it has no way of knowing what the address of
--------------------
I am not sure whether the address of the function is contained in import library file, which is input to the linker? What is the content/format of import library file?
regards,
George
|
|
|
|
|
George_George wrote: I am not sure whether the address of the function is contained in import library file, which is input to the linker
IMHO, the link can clarify this,
anyway i extract the portion,
So now this code:
__declspec(dllimport) void func1(void);
void main(void)
{
func1();
}
generates this instruction:
call DWORD PTR __imp_func1
There is no thunk and no
jmp
Here
__imp_func1
is the address for
func1's slot in the import address table of the .EXE file. All the addresses are thus known to the linker. The loader only has to update the .EXE file's import address table at load time for everything to work correctly.
loader updated the IAT, and already __declspec(dllimport) generates code to point to the IAT slot....
George_George wrote: What is the content/format of import library file?
start a new thread so that may get noticed by others
Iam not familiar with format, sorry i just care about concepts for similar context.
modified on Monday, February 18, 2008 9:54 AM
|
|
|
|
|
|
George_George wrote: I have followed your comments to start a new thread
I comment, to get noticed your new question by others, i am not familiar with the format of the object file. may be my wrong idea. Any way i assume u got the concept behind "dllimport"
|
|
|
|
|
Sorry, Rajkumar! I may not make myself understood enough, pther than the exact format of import library, I mean how linker utilize the import library to generate two forms of call statement, one for the case with dllimport and one for the case without dllimport.
I am wondering what are contained in the import library so that the linker could utilize it to generat both forms.
regards,
George
|
|
|
|
|
George_George wrote: I mean how linker utilize the import library to generate two forms of call statement
George_George wrote: one for the case with dllimport
how call statement is mapped to indirect pointer to IAT slot is extracted in the previous reply.
George_George wrote: one for the case without dllimport
without dllimport means the function is statically linked, that is linker knows the address of the function,
Without __declspec(dllimport), given this code:
void func1(void);
void main(void)
{
func1();
}
the compiler generates code that looks like this:
call func1
and the linker translates the call into something like this:
call 0x4000000 ; The address of 'func1'.
the address of the function is already known to the linker.
If
func1
exists in another DLL, the linker can't resolve this directly because it has no way of knowing what the address of
func1
is.
and the remaining section decribes the technique used for dllimport.
|
|
|
|
|
Thanks Rajkumar,
Why import library can not decide the address of the import function? Because of the address can not be decide until load time -- DLL rebase or?
regards,
George
|
|
|
|
|
Hello everyone,
Sometimes, we allocate array of zero elements. I am wondering for what regualr purpose will we do that?
I have tested that in Visual Studio 2008, it runs ok.
int main()
{
char* buf = new char [0];
delete[] buf;
return 0;
}
thanks in advance,
George
|
|
|
|
|
It works, but it's Microsoft specific, you may have problem on different platforms.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
modified on Sunday, February 17, 2008 9:51 AM
|
|
|
|
|
i think it is C++ standard,
§5.3.4/7: "When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allocate an array with no elements."
|
|
|
|
|
You're right. Maybe I was too drunk.
the following one is the non-standard I was (wrongly) addressing
struct A
{
int a[0];
};
Thanks.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
CPallini wrote: Maybe I was too drunk
I think u r too drunk, as u r not sure that u r too drunk
|
|
|
|
|
Can not compile in Visual Studio 2008.
regards,
George
|
|
|
|
|
u mean this
struct A{
int a[0];
};
i don't know about 2008, VS2005 gives warning in C++ when warning level is greater than 1. previous version needs the option /Ze (ms extension).
following is same as above and compiles in VS2005 as above and also found in GCC
struct A{
int a[];
};
|
|
|
|
|
Thanks Rajkumar,
Here is the compile error message in Visual Studio 2008. With warning level 3 -- default one.
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C2146: syntax error : missing ';' before identifier 'mean'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C2143: syntax error : missing ';' before 'this'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(1) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : error C2143: syntax error : missing ';' before '{'
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : error C2447: '{' : missing function header (old-style formal list?)
Looks like int a[0] can not be used.
regards,
George
|
|
|
|
|
can u post the code, it seams something else.
|
|
|
|
|
Sorry Rajkumar,
You are correct. I posted the wrong output and source codes.
Here is the current version, please review.
d:\visual studio 2008\projects\test_array3\test_array3\main2.cpp(2) : warning C4200: nonstandard extension used : zero-sized array in struct/union
Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
struct A{
int a[0];
};
environment Visual Studio 2008 and warning level 3 (default).
regards,
George
|
|
|
|
|
so no change for this behavior from VC2005 to VC2008, change the warning level to 1, i think u won't get warning also.
|
|
|
|
|
Thanks Rajkumar,
I have verified you are correct.
regards,
George
|
|
|
|
|
|
George_George wrote: Sometimes, we allocate array of zero elements. I am wondering for what regualr purpose will we do that?
It seems u used to allocate. sometimes
without any regular purpose?
char *ptr = new char[0];
eventhough empty, returns unique value of address, any trick using that?
modified on Sunday, February 17, 2008 10:02 AM
|
|
|
|
|
Thanks Rajkumar,
Do you have any experience of using in this way?
regards,
George
|
|
|
|
|
George_George wrote: Sometimes, we allocate array of zero elements.
We? We who?
Alcohol. The cause of, and the solution to, all of life's problems - Homer Simpson
|
|
|
|