2019年12月16日星期一

Changing Display font in XTerm and UXTerm

Edit .Xresources to set the desire True Type font for UXTerm and XTerm.
XTerm*renderFont: true
XTerm*faceName: DejaVu Sans Mono
XTerm*faceSize: 10

UXTerm*renderFont: true
UXTerm*faceName: DejaVu Sans Mono
UXTerm*faceSize: 10
Use xrdb to merge your setting into the X server resource database.
xrdb -merge ~/.Xresources
Use xrdb -q to query the resulting resource setting:
$ xrdb -q
*customization: -color
UXTerm*faceName:        DejaVu Sans Mono
UXTerm*faceSize:        10
UXTerm*renderFont:      true
XTerm*faceName: DejaVu Sans Mono
XTerm*faceSize: 10
XTerm*renderFont:       true
Xcursor.size:   18
Xcursor.theme:  DMZ-White
Xcursor.theme_core:     true
You can find the correct font name with the following command:
fc-list | cut -f2 -d: | sort -u

2019年12月11日星期三

Add directory to library path

# vi /etc/ld.so.conf.d/example.conf

add the following to the file

/usr/local/lib

# ldconfig


to verify  it

# ldconfig -v | grep /usr/local/lib

2019年8月11日星期日

start i3 inside lxc vm

1. install i3 in vm

2. on host, start local x server
host$ sudo xinit /usr/bin/xterm -- :1 &

3. x server starts, now it's on xterm with root privilege. Switch to a user, then ssh to vm
// switch to a user account
host# su -l u
host$ ssh -fY remotevm /usr/bin/i3

4. i3 started, but still it shows host's prompt.  Use i3 to start a new terminal. The new window will be inside the remote vm.

2019年5月13日星期一

making a static lib using another static lib

8
Static libraries are just archives of object (.o) files, so you can't have embedded dependency information. Something like ar cr lib1.a foo.o bar.o [more object files] will build your libraries.
Because there is no dependency information, your main program has to link both the libraries and it's important to link lib1 after lib2 when lib2 depends on lib1 (otherwise the linker won't find the symbols that are unresolved in lib2). A linking step could therefore look like this (assuming you use gcc and your libraries are in the current directory):
gcc -otest main.o -L. -Wl,-Bstatic -l2 -l1
  • +1 I thought the same but due to less experience in C I didn't answered. (Y) – Harneet Singh Aug 5 '17 at 12:19
  • @rici the linker is not in the scope of the standard. This is about the GNU linker. You can list the same library twice in an invocation if necessary. – user2371524 Aug 5 '17 at 14:45
  • For libraries, it is possible to place them twice on the command line:-l1 -l2 -l1 will handle references in either direction including mutual recursion. – rici Aug 5 '17 at 14:49
  • That's what I just wrote, responding to your now-deleted comment. – user2371524 Aug 5 '17 at 14:50
  • Felix, libraries are not in scope but the linker is part of the implementation. The standard provides for translation units and a mechanism to run a complete program, so there must be something like a linker. – rici Aug 5 '17 at 14:56
  • As to the other, i misread your answer so i deleted the complaint. Typing on glass is slow, at least for me. Sorry for the confusion. – rici Aug 5 '17 at 14:57 
  • Isn't there a way to make l2.lib contain the l1.lib objects as well? So when linking to the parent project of l2.lib only l2.lib will be linked? – Royi Apr 20 at 6:54

2019年5月5日星期日

show macro debug info

gcc -g3 testxed.c -Ixed/include xed/lib/libxed.a -o testxed

readelf --debug-dump=macro ./testxed

2019年4月10日星期三

c++ get member function's address

There exists a syntax to get the address of the member function in MSVC (starting from MSVC 2005 IMHO). But it's pretty tricky. Moreover, the obtained pointer is impossible to cast to other pointer type by conventional means. Though there exists a way to do this nevertheless.
Here's the example:
// class declaration
class MyClass
{
public:
    void Func();
    void Func(int a, int b);
};

// get the pointer to the member function
void (__thiscall MyClass::* pFunc)(int, int) = &MyClass::Func;

// naive pointer cast
void* pPtr = (void*) pFunc; // oops! this doesn't compile!

// another try
void* pPtr = reinterpret_cast<void*>(pFunc); // Damn! Still doesn't compile (why?!)

// tricky cast
void* pPtr = (void*&) pFunc; // this works
The fact that conventional cast doesn't work, even with reinterpret_cast probably means that MS doesn't recommend this casting very strongly.
Nevertheless you may do this. Of course this is all implementation-dependent, you must know the appropriate calling convention to do the thunking + have appropriate assembler skills.


or



4
try this. should let you cast anything to anything :)
template<typename OUT, typename IN>
OUT ForceCast( IN in )
{
    union
    {
        IN  in;
        OUT out;
    }
    u = { in };

    return u.out;
};
then
void* member_address = ForceCast<void*>(&SomeClass::SomeMethod);