Okay I think maybe it's that the marker for the end of the list is not in the right spot. All my other projects I have been building as shared libraries, but this one is based on static libs.
I need to specify at the end of all libraries a seperate library.... but after all the libraries that have been applied to this exectuable target are a bunch more libraries, presumably the ones that are recursively referenced by other libs.... So how can I add a library to the very end of the list to link? On Mon, Jul 23, 2012 at 5:35 PM, J Decker <[email protected]> wrote: > On Mon, Jul 23, 2012 at 2:45 PM, Brad King <[email protected]> wrote: >> On 07/23/2012 02:31 PM, J Decker wrote: >>> In this commit --no-whole-archive is artificially added to compile >>> options in Modules/Platform/Windows-GNU.cmake. >>> >>> http://cmake.org/gitweb?p=cmake.git;a=commit;h=5f05a3c25e1480648f46c9ccbf775225f9e8e32d >>> >>> This is causes no end of problems for me; because I have code which is >>> indirectly referenced such that LD doesn't identify it as being used. >> >> By what mechanism is code "indirectly referenced" such that >> references are not visible to the linker? >> > > I'm not entirely sure... these are the defines/relavent data structures... > > even though I apply __attribute__((used)), though it's in another > section __attribute__((section("deadstart_list"))) ... > > so the static routine and the static structure should be kept; part of > the init of the structure is the address of the routine to make sure > that's kept... but the only references are between the data and the > code... but somehow these blocks of code and data are being omitted > when linking from .a files. > > I link a object at the start and end that contain the beginning and > end of 'deadstart_list' section, which I go through and use all the > structures that have been compiled there. It's a way to schedule > pre-runtime code initializers... (things that run before main) > > typedef unsigned char __type_rtp; > typedef void(*__type_rtn ) ( void ); > struct rt_init // structure placed in XI/YI segment > { > #ifdef __cplusplus > //rt_init( int _rtn_type ) { rt_init::rtn_type = _rtn_type; } > /*rt_init( int _priority, CTEXTSTR name, __type_rtn rtn, CTEXTSTR > _file, int _line ) > { > rtn_type = 0; > scheduled = 0; > priority = priority; > file = _file; > line = _line; > routine = rtn; > } > */ > #endif > #define DEADSTART_RT_LIST_START 0xFF > __type_rtp rtn_type; // - near=0/far=1 routine indication > // also used when walking table to flag > // completed entries > __type_rtp scheduled; // has this been scheduled? (0 if no) > __type_rtp priority; // - priority (0-highest 255-lowest) > #define INIT_PADDING ,{0} > char padding[1]; // need this otherwise it's 23 bytes and that'll be > bad. > int line; // 32 bits in 64 bits.... > __type_rtn routine; // - routine (rtn) > CTEXTSTR file; > CTEXTSTR funcname; > struct rt_init *junk; > . struct rt_init *junk2[3]; > . __attribute__((packed)); > > #define JUNKINIT(name) ,&pastejunk(name,_ctor_label) > #define RTINIT_STATIC static > > #define PRIORITY_PRELOAD(name,pr) static void name(void); \ > RTINIT_STATIC struct rt_init pastejunk(name,_ctor_label) \ > __attribute__((section("deadstart_list"))) __attribute__((used)) \ > ={0,0,pr INIT_PADDING \ > ,__LINE__,name \ > ,WIDE__FILE__ \ > ,#name \ > JUNKINIT(name)}; \ > static void name(void) __attribute__((used)); \ > void name(void) > > > >> Depending on your use case consider the object library feature: >> >> http://www.cmake.org/Wiki/CMake/Tutorials/Object_Library >> >>> any idea how I can get around the --no-whole-archive flag? >> >> target_link_libraries(my_target -Wl,--whole-archive my_archive) > > I'll try adding that as the first library... > >> >> -Brad -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers
